原题链接:https://vjudge.net/problem/UVA-202
题意:求一个数除以一个数商,如果有重复的数字(循环小数),输出,如果没有,输出前50位。
题解:这个题一开始考虑的是一个一个判,但太麻烦,复杂度太高,于是转化思路,如果是循环小数,那么余数与之前的相同,那么只需要统计余数是否相同,及其所出现的位置
ac代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int xiao[3110],yu[3110];
int main()
{
int m,z;
while(cin>>m>>z)
{
int i,j,flag=1,zheng=m/z;
memset(yu,0,sizeof(yu));
memset(xiao,0,sizeof(xiao));
printf("%d/%d = %d.",m,z,zheng);
for(i=0;i<z;i++)
{
m=m%z;
yu[i]=m;
m*=10;
xiao[i]=m/z;
for(j=0;j<i;j++)
if(yu[i]==yu[j]){flag=0;break;}
if(flag==0) break;
}
int w=j;
for(int k=0;k<w;k++)
cout<<xiao[k];
cout<<"(";
if(i-j<=50)
{
for(w=j;w<i;w++)
cout<<xiao[w];
}
else
{
for(w=j;w<j+50;w++)
cout<<xiao[w];
cout<<"...";
}
cout<<")"<<endl;
printf(" %d = number of digits in repeating cycle\n\n",i-j);
}
return 0;
}