循环小数——模拟除法

Posted lfri

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环小数——模拟除法相关的知识,希望对你有一定的参考价值。

题目

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

解题思路

用模拟除法,并用数组模拟每次存储每次相除的结果,每除一次与前面的所有元素比较一次,如果与数组中某一元素相等,即可停止循环,因为此时循环节已经找到,并用变量m、n分别记录循环节的起始和终止位置,然后就是按规定的格式输出。

代码实现

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 const int maxn = 3000 + 10;
 8 int a, b;
 9 int frac[maxn],pos[maxn],yu[maxn];
10  
11 int main()
12 {
13     while (scanf("%d%d",&a,&b) == 2)
14     {
15         int tmp = a;
16         memset(frac, 0, sizeof(frac));
17         memset(pos, 0, sizeof(pos));
18         memset(yu, 0, sizeof(yu));
19 
20         int cnt = 0;
21         frac[cnt++] = a / b;
22         a = a % b;
23 
24         while (!pos[a] && a)
25         {
26             yu[cnt] = a;             //记录每个余数
27             pos[a] = cnt;            //记录每个余数的位置
28             frac[cnt++] = (a * 10) / b;    //记录商
29             a = (a * 10) % b;
30         }
31 
32         printf("%d %d = %d.", tmp, b, frac[0]);
33         for (int i = 1; i <= 50 && i < cnt; i++)
34         {
35             if (a & yu[i] == a)  printf("(");  //利用了循环节前一个和循环节最后一个的余数相同
36             printf("%d", frac[i]);
37         }
38         if (!a)
39             printf("(0");
40         if (cnt > 50)
41             printf("...");
42         printf(")
");
43         printf("   %d = number of digits in repeating cycle

", a == 0 ? 1 : cnt - pos[a]);
44     }
45     return 0;
46 }

参考链接:https://blog.csdn.net/qiweigo/article/details/43051043

 

以上是关于循环小数——模拟除法的主要内容,如果未能解决你的问题,请参考以下文章

N分之一 竖式除法模拟

LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化

C语言必会面试题(3耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个開始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,...)(代码片段

将 for 循环合并到整数除法中

一个函数应该返回什么可以失败?

我可以在 PHP 的循环中使用除法吗?