Repeating Decimals UVA - 202
题意大概就是求一个循环节,这道题难的就是在这里了吧。
仔细想一想就能发现,当出现循环节的时候就是被除数与余数都相等的时候,所以我们可以开出一个数组,b[j]记录被除数为j是第几位,然后当再次走到这个位置,由当前的cnt-b[j]就是循环节的长度了。
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int b[10005];
int m,n;
int main(){
while(scanf("%d %d",&m,&n)!=EOF){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[0]=m/n;
printf("%d/%d = %d.",m,n,a[0]);
m=m%n;
int cnt=1;
while(!b[m] && m){
b[m]=cnt;
a[cnt++]=m*10/n;
m=m*10%n;
}
if(m==0){
for(int i=1;i<cnt;i++)
printf("%d",a[i]);
printf("(0)\n");
}
else{
int i;
for(i=1;i<b[m];i++)
printf("%d",a[i]);
printf("(");
for(;i<cnt && i<=50;i++)
printf("%d",a[i]);
if(cnt>50)
printf("...");
printf(")\n");
}
printf(" %d", m ? cnt-b[m] : 1);
printf(" = number of digits in repeating cycle\n\n");
}
return 0;
}