思路:模拟小学除法一位一位算小数点后面的数,应为除数相同,当余数第二次出现时,第二次出现后的运算将重复第一次到第二次间的运算,故第二次出现到第一次出现的小数串为循环的 要考虑 0.133333这种不是在第一位循环的小数,其次是50位以后用...
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int vis[3010];
int r[3010];
int s[3010];
int main(){
int a,b;
while(cin>>a>>b){
int t=a;
memset(vis,0,sizeof(vis));
memset(r,0,sizeof(r));
memset(s,0,sizeof(s));
r[0]=a/b;
t=t%b;
int count=1;
while(!vis[t]&&t){
vis[t]=count; //记录小数位数
r[count]=t*10/b; //每一位数值
s[count++]=t; //记录最后一次t 如果最后一次的t,使得s[i]==t,则 i为开始循环的地方
t=t*10%b;
}
printf("%d/%d = %d.",a,b,r[0]);
for(int i=1;i<count;i++){
if(i>50){printf("...");break;}
if(s[i]==t&&t)printf("("); //从开始循环的位数前输出左括号
cout<<r[i];
}
if(!t)printf("(0");
printf(")\n");
if(!t)count=1;
else count=count -vis[t];//不一定是从第一个小数开始循环 要减去前面没用的小数位数
printf(" %d = number of digits in repeating cycle\n",count);
printf("\n");
}
return 0;
}