题目链接:https://odzkskevi.qnssl.com/249e6049be24dee57a1c3b28ebf8f12d?v=1510665795
这个题题意:输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。例
如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21。
就是求循环节,模拟一下
这里有一个优化,如果后面某一位余数和前面某一位余数相同,那么就构成循环了,仔细想想,就是那么回事哈
如果不理解,建议先别看输出,在纸上画画那个除法的竖式
My ugly code
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int maxn=3000+30;
int n,m;
int vis[maxn],r[maxn],bb[maxn];
int cas=1;
int main(){
while(~scanf("%d%d",&n,&m)&&m){
printf("%d/%d = %d.",n,m,n/m);
int cnt=0;
r[cnt++]=n/m;
n=n%m;//n代表余数
memset(vis,0,sizeof(vis));
memset(bb,0,sizeof(bb));
bb[0]=n;
while(!vis[n] && n > 0){
vis[n]=1;
bb[cnt]=n;
r[cnt++]=(n*10)/m;
n=(n*10)%m;
}
int jian=0;
for(int i=1;i<cnt && i<=50;i++){
if(bb[i] == n){
printf("(");
jian=i;
}
printf("%d",r[i]);
}
if(n==0){
cnt=1;
printf("(0");
}
if(cnt > 50)
printf("...");
printf(")\n");
printf(" %d = number of digits in repeating cycle\n",cnt-jian);
printf("\n");
}
return 0;
}