UVa 202 Repeating Decimals

计算循环小数的循环节

输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度。

例如,a=5,b=43,小数表示为0.(116279069767441860465),循环字节长度为21

 

可以用数组储存数字,模拟竖式除法来解决。

 

附AC代码:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int MAX=3050;
 6 
 7 int r[MAX],u[MAX],s[MAX];
 8 
 9 int main(){
10     int n,m,t;
11     while(cin>>n>>m){
12         t=n;
13         memset(r,0,sizeof(r));
14         memset(u,0,sizeof(u));
15         memset(s,-1,sizeof(s));
16         int ans=0;
17         r[ans++]=n/m;//r数组用来存储数字 
18         n=n%m;
19         while(!u[n]&&n){//模拟竖式除法 
20             u[n]=ans;//u数组记录重复点位置 (即位数) 
21             s[ans]=n;//s用来判断在哪一点重复 
22             r[ans++]=10*n/m;
23             n=10*n%m;
24         }
25         cout<<t<<"/"<<m<<" "<<"="<<" "<<r[0]<<".";
26         for(int i=1;i<ans&&i<=50;i++){
27             if(n&&s[i]==n)//当条件成立时即为循环开始 
28             cout<<"(";
29             cout<<r[i];
30         }
31         if(!n)//可除尽时 
32         cout<<"(0";
33         if(ans>50)//不要忘了大于50位要用... 
34         cout<<"...";
35         cout<<")"<<endl;
36         int sum=n?(ans-u[n]):1;//总位数减循环开始的位数即为循环位数 
37         cout<<"   "<<sum<<" = number of digits in repeating cycle"<<endl<<endl;
38     }
39     return 0;
40 }

 

posted @ 2016-07-14 21:39  Kiven#5197  阅读(228)  评论(0编辑  收藏  举报