UVA 202 Repeating Decimals

【题意】

         给你两个数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;
}

有什么好的方法或上面代码有什么问题请留言~












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值