您的位置:首页 > 其它

UVA 202 Repeating Decimals

2016-09-21 21:50 489 查看
【题意】

         给你两个数n和m(0<n,m<=3000),求他们相除的商,输出循环的部分,如果循环长度大于50则50以后的输出...,输出循环部分的长度。每组数据后一个空行。

例:

  输入:

      76 25

      5 43

      1 397

  输出:

     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


【分析】

      可以先用模拟一下,运算的过程。

       运算过程不就是n/m,输出整除结果,保留余数,余数*10继续除以m,重复进行,直到余数相同就结束。表示找到循环部分,所以需要三个数组保存,一个保存整除结果,一个保存余数,一个标记数组,因为m最大3000所以最多执行3000次循环,就出现结果,接着就是输出括号,首先上面当你跳出循环的时剩的余数,前面与余数相等的地方就是开始循环的地方。加个左括号,超过50输出...跳出,输出右括号。输出循环长度只需记录加左括号的坐标,用总长度-坐标+2。

【代码】

#include<stdio.h>
#include<string.h>
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
printf("%d/%d = ",n,m);
int x=n%m;
int book[3010]={0};
int a[3010]={0},b[3010]={0};
book[x]=1;
int l=0,h=0,t;
a[l]=n/m; // 从整数开始保存,以为要保存余数,方便输出
b[l]=x; // 保存余数和保存商用一个变量l进行扩展,两个可能会错位
l++;
x*=10;
while(1)
{
a[l]=x/m;
x%=m;
b[l]=x;
l++;
if(book[x])
break;
book[x]=1;
x*=10;
h++;
}
printf("%d.",a[0]);
for(int i=1;i<l;i++)
{
if(b[i-1]==x) // b数组是保存的余数,所以上一个余数相等,证明下面的会变成循环
{
printf("(");
t=i;
}
printf("%d",a[i]);
if(i==50)
{
printf("...");
break;
}
}
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n",h-t+2); // +2是因为t的值是循环开始时上一个的坐标,两个坐标相减也要+1.
}
return 0;
}


有什么好的方法或上面代码有什么问题请留言~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: