您的位置:首页 > 其它

循环小数 UVa202

2016-03-12 22:55 274 查看
输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度。

例如,a=5,b=43,小数表示为0.(116279069767441860465),循环字节长度为21

这个题,忘了怎样使a/b的结果保留多位小数!!!

具体方法为计算得出其多位小数(位数要足够大),再判断其周期,周期不会超过分母就在小于范围内的周期一个一个判断即可。

注意,该题循环不一定是从小数点后一位数开始,可能从之后才开始循环

应该想到竖式,那就是求小数点后n位的方法! a/b求出整数位,接着(a%b)*10/b即为小数点后一位,下一位a=a%b继续上一步骤可得

写吐了

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int p[3000];
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)==2&&b){
int t=a%b,k=0,c,x;
x=floor((double)a/b);
printf("%d/%d=%d.",a,b,x);
memset(p,0,sizeof(p));
for(int i=0;i<3000;i++){       //计算小数点后3000位小数
t*=10;
p[i]=t/b;
t%=b;
}
while(1){             //循环是从第k位开始
bool flag;
for (c=1;c<=b;c++){     //周期c是大于0且小于等于b的人一个数
flag=true;
for (int j= 0;j<3000-k;j++)
if(p[j+k]!=p[j%c+k]){     //j%c+k为第一个周期
flag=false;
break;
}
if(flag)break;
//cout<<c<<" *"<<k<<endl;
}
if(flag){
for(int j=0;j<k;j++)printf("%d",p[j]);
printf("(");
if (c<= 50)for(int j=k;j<c+k;j++)printf("%d",p[j]);
else{
for(int j=k;j<k+50;j++)printf("%d",p[j]);
printf("...");
}
printf(")\n");
printf("   %d = number of digits in repeating cycle\n\n",c);
break;
}
k++;
}
}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: