题意:
输入整数a和b(0≤a≤3000, 1≤b≤3000) , 输出a/b的循环小数表示以及循环节长度。 例如a=5, b=43, 小数表示为0.(116279069767441860465), 循环节长度为21。如果循环节超过50位,就在第50位后打省略号(三个点,就像“…”)
题解:
本题可以定义两个数组,一个存放商,一个存放余数。利用%(模)运算和/(除)运算,循环求出每一步的商和余数,每循环一次,将余数与前面所求的余数做比较,找到相同的余数,则停止循环,已经找出循环节。
这道题最主要的是输出格式比较复杂,一定要看好空格,不要多也不要少。
#include<stdio.h>
#include<string.h>
int main()
{
int a,b;
int ans[10000],res[10000];
while(scanf("%d%d",&a,&b)==2)
{
int sta=-1;
int num;
memset(ans,0,sizeof(ans));
memset(res,0,sizeof(res));
ans[0]=a/b;
res[0]=a%b;
num=0;
while(1)
{
if(res[num]==0) break;
num++;
ans[num]=res[num-1]*10/b;
res[num]=res[num-1]*10%b;
for(int i=0;i<num;i++)
{
if(res[i]==res[num])
{
sta=i;
break;
}
}
if(sta!=-1) break;
}
printf("%d/%d = %d.",a,b,ans[0]);
if(res[num]==0)
{
for(int i=1;i<=num;i++)
printf("%d",ans[i]);
printf("(0)\n %d = number of digits in repeating cycle\n\n",1);
}
else{
for(int i=1;i<sta+1&&i<=50;i++)
printf("%d",ans[i]);
printf("(");
for(int i=sta+1;i<=num&&i<=50;i++)
printf("%d",ans[i]);
if(num>50) printf("...");
printf(")\n %d = number of digits in repeating cycle\n\n",num-sta);
}
}
return 0;
}