循环小数 计算小数循环节和循环节长度 202 - Repeating Decimals

输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度。例如a=5,b=43,小数表示为

0.(116279069767441860465),循环节长度为21;  

思路:分数不能表示无限不循环小数。建立3个数组,一个放商,一个放余数,一个对应下角标的数若是余数则元素为1,即记录余数存在。循环除数加一次,若余数为0,则循环节长度为1,若当前得到的余数已经存在,则有循环节,求出2个相同余数的距离即为循环节长度。

  这个主要是怎么寻找循环节,在除法计算的过程中如何判断一个循环节已经出现了。循环节第二次出现意味着计算过程中的余数已经第二次出现。其实自己在草纸上写一个比如5/7就能发现。当商5的时候(5是循环节的最后一位)余数是5,这和第一次商0的时候(0是循环节前一位)余数也是五。然后用索引存储是否这个余数已经出现过,还有一个数组记录余数对应的商的位置。余数的范围是1~m-1,所以循环节最长是m-1,所以查询数组的大小根据m的值来设定


  1. #include <iostream>  
  2. #include <cstdlib>  
  3. #include <cstring>  
  4. #include <cstdio>  
  5.   
  6. using namespace std;  
  7.   
  8. int r[3003],u[3003],s[3003];  
  9.   
  10. int main()  
  11. {  
  12.     int n,m,t;  
  13.     while (cin >> n >> m) {  
  14.         t = n;  
  15.         memset(r, 0, sizeof(r));  
  16.         memset(u, 0, sizeof(u));  
  17.         int count = 0;  
  18.         r[count ++] = n/m;  
  19.         n = n%m;  
  20.         while (!u[n] && n) {  
  21.             u[n] = count;  
  22.             s[count] = n;  
  23.             r[count ++] = 10*n/m;  
  24.             n = 10*n%m;  
  25.         }  
  26.         printf("%d/%d = %d",t,m,r[0]);  
  27.         printf(".");  
  28.         for (int i = 1 ; i < count && i <= 50 ; ++ i) {  
  29.             if (n && s[i] == n) printf("(");  
  30.             printf("%d",r[i]);  
  31.         }  
  32.         if (!n) printf("(0");  
  33.         if (count > 50) printf("...");  
  34.         printf(")\n");  
  35.         printf("   %d = number of digits in repeating cycle\n\n",!n?1:count-u[n]);  
  36.     }  
  37.     return 0;  
  38. }  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值