求循环小数的表示以及循环节长度

问题:

  输入整数a和b,输出a/b的循环小数表示以及其循环节长度。例如 a=5 b=43 小数表示为0.(116279069767441860465),循环节长度为21;

 

分析: 

  长除法的计算过程

 

    ①mod = a%b;

 

    ②小数 = (mod*10) / b;

 

    ③mod = (mod*10)%b;

 

  循环②③步,当出现重复的余数的时候,也就是循环节出现了

注意事项:

  当循环上述2、3步骤时,出现余数为零的情况,即计算结果不是循环小数时,直接输出索引值,循环节长度为0。

 

C++实现:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main() {
 5     int a, b, t, k;
 6     cin >> a >> b;
 7     int index = 0;
 8     t = a%b;
 9     if (t ==0) {
10         cout << index << " " << index << endl;
11         return 0;
12     }
13     int flag[10000] = {0};
14     memset(flag,-1,1000);
15     k =0;
16     int length = 0;
17     while (true) {
18         t = (t*10)%b;
19         if (t == 0) {
20             index = ++k;
21             length = 0;
22             break;
23         }
24 
25         if(flag[t] >= 0) {
26             index = flag[t];
27             length = k - index;
28             break;
29         }
30         flag[t]=k;
31         k++;
32     }
33 
34     cout << index << " " << length << endl;
35     return 0;
36 }

 

 

    

转载于:https://www.cnblogs.com/TonvyLeeBlogs/p/9563915.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值