您的位置:首页 > 其它

(WA) 求改..UVa202 Repeating Decimals 循环小数 紫书习题3-8

2015-04-01 10:01 501 查看
提交还是wa, 怎么改啊….

参考了http://www.2cto.com/kf/201408/322120.html

思路写在了代码注释里。

代码:

//xi 3-8 Repeating Decimals.cpp
/*第0步,分子是5,分母是7(分母在整个除法中始终不变),5/7的商是0,代表这个除法的整数部分是0,,余数是5,乘以10,得50作为第1步的分子;50/7的商为7,代表这个除法的第一位小数是7,余数是1,乘以10,得10作为第2步的分子...可以发现每步的除法只跟分子有关,也就是当分子出现重复值,如上图第1步和第7步的分子值都为50时,第7步后面的运算其实是在重复第1步至第6步间的运算。所以第1步至第7步就是一个循环节。*/ 
#include <cstdio>
using namespace std;

int A[2][3010], p, q;//程序实现中,可以不用存储余数的值,只需存储上
                        //图中的分子和商,我定义了A[2][3010],用A[0]
                        //[j]存储第j步的分子,
               //A[1][j]存储第j步的商。注意最后的数值由商可以直接构成
int myfind() //找i位之前是否有重复分子出现;有则返回周期len,否则返        
            //回-1.
{
    for(p = 1; p < q; p++)
    {
        if(A[0][p] == A[0][q])
         return q - p;
    }
    return -1;
}

int main()
{
    int kase, a, b, i, len;
    for(kase = 1; scanf("%d%d", &a, &b) == 2; kase++)
    {
        A[0][0] = a; A[1][0] = a/b;
        for(q = 1; ; q++)
        {
            A[0][q] = (A[0][q-1] - b*A[1][q-1])*10; //分子 
                                                //, 一直X10 
                                                    //A[0]
                                                                                                        //[q] = 10*A[0][q-1] % A[1][q-1]; //不能这样
                    //写, 因为这样写可能分母为0 
            A[1][q] = A[0][q] / b;                   //商 
            len = myfind();
            if(len > 0) break;
        }
        printf("%d/%d = %d.", a, b, A[1][0]);
        for(int i = 1; i < p; i++)
            printf("%d", A[1][i]);
        putchar('(');
        for(int i = p; i < q; i++)
        {
            if(i > 50)
            {
                printf("...");
                break;
            }
            printf("%d", A[1][i]);
        }
        printf(")\n %d = number of digits in reperting cycle\n\n", len);
    }
    return 0;
}


注意:其中分子是余数X10, 为避免a/b为0, 不用%符号来取得余数, 用A[0][q] = (A[0][q-1] - b*A[1][q-1])*10;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: