您的位置:首页 > 其它

uva202 循环小数

2017-01-23 11:31 288 查看
题目描述:输入整数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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva202