Uva-202 - Repeating Decimals-WA to AC

数理题

读完题第一次的算法是模拟除法运算,简单算了几个估计只要有3个连续小数与前面有一致的,就说明找到了循环节,这种算法是错误的,有很多特殊情况不能满足,所以一直WA。
WA的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a0,a,b,i,j,x,len,num[100005]={0};
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        len=0; a0=a;
        num[0]=a/b;
        a=(a%b)*10;
        for (i=1;;i++)
        {
            num[i]=a/b;
            a=(a%b)*10;
            for (j=1;j<=i-3;j++)
            {
                if (num[j]==num[i-2]&&num[j+1]==num[i-1]&&num[j+2]==num[i])
                {
                    len=(i-2)-j;
                    x=j;
                    break;
                }
            }
            if (len) break;
        }
        printf("%d/%d = %d.",a0,b,num[0]);
        for (i=1;i<x;i++)
            printf("%d",num[i]);
        putchar('(');
        if (len>50)
        {
            for (i=x;i<x+50;i++)
                printf("%d",num[i]);
            printf("...");
        }
        else
            for (i=x;i<x+len;i++)
                printf("%d",num[i]);
        putchar(')');
        printf("\n   %d = number of digits in repeating cycle\n\n",len);
    }
    return 0;
}


 

无奈之下看完题解的算法,说什么抽屉原则,反正就是找到有一个余数与前面的一致,就说明找到了循环节,这个算法就满足所有情况,所以果断采用了这种方法。

看大神们都在用C++写,我也开始尝试用C++,第一次用C++ A题,贴出来:

 AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX_SIZE 30005

using namespace std;

int main()
{
    int a,b,a0,num[MAX_SIZE],q[MAX_SIZE],k;//num用于储存小数,q用于储存余数是否出现过
    while(cin>>a>>b)
    {
        memset(q,0,sizeof(q));
        k=0; a0=a;
        num[0]=a/b;
        a=(a%b)*10;
        while(a&&!q[a])
        {
            num[++k]=a/b;
            q[a]=k;//顺便记录某余数出现的位置
            a=(a%b)*10;
        }
        cout << a0 << '/' << b << " = " << num[0] << '.';
        if (a)
        {
            for (int i=1;i<q[a];i++)
                cout << num[i];
            cout << '(';
            for (int i=q[a];i<=k&&i<q[a]+50;i++)
                cout << num[i];
            if (k-q[a]+1>50)
                cout << "...";
            cout << ')' << endl;
            cout << "   " << k-q[a]+1 << " = number of digits in repeating cycle" << endl;
        }
        else
        {
            for (int i=1;i<=k;i++)
                cout << num[i];
            cout << "(0)" << endl;
            cout << "   1 = number of digits in repeating cycle" << endl;
        }
        cout << endl;
    }
    return 0;
}


 

你可能感兴趣的:(Uva-202 - Repeating Decimals-WA to AC)