《算法竞赛入门经典》 习题3-8 循环小数
输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度。例如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21.
#include<stdio.h>
#include<memory.h>
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
{
int count=0;
int c=a;
int ans[3010],repet[3010],s[3010];
memset(ans,0,sizeof(ans));
memset(repet,0,sizeof(repet));
ans[count++]=a/b; //记录整数部分
a=a%b; //取余数
while(!repet[a]&&a) /*当出现相同数时,循环节结束,跳出循环,或余数为0时,跳出*/
{
repet[a]=count;
s[count]=a;
ans[count++]=10*a/b; //记录小数
a=10*a%b;
}
printf("%d/%d=%d.",c,b,ans[0]);
for(int i=1;i<count&&i<=50;i++)
{
if(a==s[i]&&a) printf("("); // a不等于0,说明有循环节
printf("%d",ans[i]);
}
if(!a) printf("(0"); //如果没有循环节,循环为0
if(count>50) printf("...");
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n",!a?1:count-repet[a]);
}
return 0;
}
怎么写小数呢,可以算几个数试试,就比如5/2,先取整数2,取余1,1*10/2,取到第一个小数5,怎么算循环呢,当后面的小数与第一个小数重复时,就说明循环到了。
(イヤリングが欲しい)