题目描述:输入整数a和b,输出a/b的循环小数表示及循环节长度。
例如:
Sample Input
76 25
5 43
1 397
Sample Output
76/25 = 3.04(0)
1 = number of digits in repeating cycle
5/43 = 0.(116279069767441860465)
21 = number of digits in repeating cycle
1/397 = 0.(00251889168765743073047858942065491183879093198992…)
99 = number of digits in repeating cycle
分析:
其实就想小学生做除法一样,只需要每次取余再用余数×10就可以了,然后再每次取整,其中把所有的小数都保存下来,然后记录循环的起始位置和结束位置,只要其中两次的余数相同,那么就开始循环了。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a,b,a0,ans[40000]={0},len,str[40000]={0},place[4000]={0};
while(scanf("%d%d",&a,&b)!=EOF)
{
a0=a;//先把a保存起来
int t;
memset(ans,0,sizeof(ans));
memset(str,0,sizeof(str));
memset(place,0,sizeof(place));
a=a%b;//第一次的余数
int k=0,remain;
int p;
str[a]++;
place[a]=0;
while(1)
{
a=a*10;
ans[k]=a/b;//把小数部分保存下来
remain=a%b;
k++;
if(str[remain]==0)//判断余数是否出现过
{
a=remain;
place[remain]=k;
str[remain]++;
}
else//如果出现过,那么下面开始循环从上次的余数开始到此次为一个周期,下面开始以这个为周期开始循环
{
t=place[remain];//记录上次出现的位置
len=k-t;//记录长度
p=k;
break;
}
}
if(len<50)
{
printf("%d/%d = %d.",a0,b,a0/b);
int i;
for(i=0;i<t;i++)//输出不是循环的部分
printf("%d",ans[i]);
printf("(");
for(i=t;i<k;i++)//输出循环的部分
printf("%d",ans[i]);
printf(")\n");
printf(" %d = number of digits in repeating cycle\n",len);
}
else
{
printf("%d/%d = %d.",a0,b,a0/b);
int i;
for(i=0;i<t;i++)
printf("%d",ans[i]);
printf("(");
for(i=t;i<50;i++)
printf("%d",ans[i]);
printf("...)\n");
printf(" %d = number of digits in repeating cycle\n",len);
}
printf("\n");
}
return 0;
}