uva202repeating decimals模拟
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93800#problem/H
题意:输入整数a和b(0<=a,b<=3000),输出a/b的小数表示以及循环节长度。
思路:分数不能表示无限不循环小数。建立3个数组,一个放商,一个放余数,一个对应下角标的数若是余数则元素为1,即记录余数存在。循环除数加一次,若余数为0,则循环节长度为1,若当前得到的余数已经存在,则有循环节,求出2个相同余数的距离即为循环节长度。
#include<iostream> #include<string.h> using namespace std; #define maxn 4000 int main() { int a,b; while(cin>>a>>b) { int m[maxn],n[maxn],o[maxn]; memset(o,0,sizeof(o)); m[0]=a/b; n[0]=a%b; if(n[0]==0) { cout<<a<<"/"<<b<<" = "<<m[0]<<".(0)"<<endl<<" 1 = number of digits in repeating cycle"<<endl<<endl; continue; } o[n[0]]=1; int flag=0,ch,i; for(i=1;i<maxn;i++) { m[i]=n[i-1]*10/b; n[i]=n[i-1]*10%b; if(n[i]==0) { flag=1; break; } if(o[n[i]]==1) { for(int j=i-1;j>=0;j--) { if(n[j]==n[i]) { ch=j; break; } } break; } o[n[i]]=1; } cout<<a<<"/"<<b<<" = "<<m[0]<<"."; if(flag) { for(int u=1;u<=i;u++) { if(u==51) { cout<<"..."<<endl; break; } cout<<m[u]; } if(i<50)cout<<"(0)"<<endl; cout<<" 1 = number of digits in repeating cycle"<<endl<<endl; } else { if(ch<50) { for(int u=1;u<=i;u++) { if(u==ch+1) { cout<<"("; } if(u==51) { cout<<"..."; break; } cout<<m[u]; } cout<<")"<<endl; } else { for(int u=1;u<=50;u++) { cout<<m[u]; } cout<<"..."<<endl; } cout<<" "<<i-ch<<" = number of digits in repeating cycle"<<endl<<endl; } } return 0; }
一开始错因为能除开时省略号后还加(0)。
最后总是不过,还一直找题解,看不下去,最后突然输了1和1,发现输出1.0(0)。花了这么长时间,真是哭死了。。。