地址:https://vjudge.net/problem/UVA-202
题意:
循环小数的循环节和长度
思路:
1.用sh[]数组记录商中的小数部分,用num[]记录在计算小数部分时变化的被除数
2.当num数组中存在两个相同的元素时,则出现循环节,记录循环节的start和end值
3.当num数组中出现0时则表示运算结束,循环节是0
ac代码:
#include <iostream>
#define maxn 3050
using namespace std;
int sh[maxn];//num[i]对应的商
int num[maxn];//变化的被除数
int main()
{
int a,b,j,start,end;
while(scanf("%d%d",&a,&b)!=EOF)
{
int i=0;
num[i]=a%b;
sh[i]=num[i]*10/b;//求第一位小数
for(i=1; ;i++)
{
num[i]=num[i-1]*10%b;
sh[i]=num[i]*10/b;
for(j=0;j<i;j++)
if(num[j]==num[i])
break;
if(j<i)
{
start=j;
end=i-1;
break;
}
if(num[i]==0)
{
start=i;
end=i;
break;
}
}
printf("%d/%d = %d.",a,b,a/b);
for(j=0;j<start;j++)
cout<<sh[j];
printf("(");
if((end-start+1)>50)
{
for(j=start;j<start+50;j++)
cout<<sh[j];
printf("...");
}
else
for(j=start;j<=end;j++)
cout<<sh[j];
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n",end-start+1);
}
return 0;
}