循环小数的循环节问题
2016-11-10 15:25
218 查看
题目链接:https://www.bnuoj.com/v3/external/2/202.pdf
/* 通过模拟手算竖式的过程,可以发现 如果同一个余数在竖式中出现两次, 那么小数就开始循环了,循环节的始末位置 与这个余数出现在竖式中的位置有关 这里就不详细给出分析过程了,网上可以找到 详细的解题过程 */ #include <cstdio> #include <cstring> const int maxn = 3010; //数组d用来存放商,数组m用来存放余数,book[k]统计余数k出现的次数 int d[maxn], m[maxn], book[maxn]; int main() { int a, b; while (scanf("%d %d", &a, &b) == 2) { //head,tail用来锁定循环节的始末位置 int len, head, tail; memset(book, 0, sizeof(book)); d[0] = a / b; m[0] = a % b; book[m[0]]++; int i; //余数重复出现,说明出现循环节,跳出循环 for (i = 0; book[m[i]] < 2; i++) { int tem = m[i] * 10; d[i+1] = tem / b; m[i+1] = tem % b; book[m[i+1]]++; //统计余数出现的次数 } tail = i; //找到循环节长度 for (head = 0; m[head] != m[tail]; head++) ; len = tail - head; //输出部分 printf("%d/%d = %d.", a, b, d[0]); if (len <= 50) { for (int k = 1; k <= head; k++) printf("%d", d[k]); printf("("); for (int k = head + 1; k <= tail; k++) printf("%d", d[k]); printf(")\n"); } else { for (int k = 1; k <= head; k++) printf("%d", d[k]); printf("("); for (int k = head + 1; k <= head + 50; k++) printf("%d", d[k]); printf("...)\n"); } printf(" %d = number of digits in repeating cycle\n\n", len); } return 0; }
相关文章推荐
- UVA202 - Repeating Decimals(循环小数循环节)
- 编程实现表示循环小数,例如将1/3表示为0.3(3)就是将循环节放在括号中
- 十进制小数:循环节等问题
- 无限循环小数的循环节
- POJ 1930 Dead Fraction(gcd—枚举循环节,无限循环小数变最简分数)
- 二进制下 求分数化小数的循环节问题
- 面试:输出循环小数的循环节
- 循环小数问题
- UVA 202 - Repeating Decimals(循环小数循环节)
- 求循环小数循环节
- 华为编程题:求小数循环节问题
- 循环小数 计算小数循环节和循环节长度 202 - Repeating Decimals
- UVA 202 - Repeating Decimals【循环小数循环节】
- python再计算无限循环小数的循环节
- 好题——hdu2522(小数问题:求1/n的第一个循环节)
- nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】
- java基础——java无限循环小数判定问题以及BigDecimal详解
- 笔试题——输出循环小数的循环节
- 求除以3后结果为以3为循环节的纯循环小数的连续正整数的程序!
- 循环小数问题