UVA 202 Repeating Decimals

【题意】

         给你两个数n和m(0

例:

  输入:

      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
#include
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

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












你可能感兴趣的:(C语言,简单的好题)