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

提交还是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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源计划猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值