题目地址点击打开链接
比赛的时候是懵逼的,怎么求循环体。。。
过了这么久才来补,看了看题解才发现原来这么水。。。
题解:
解决这一题,我们稍微一分析,就能够简化问题。因为n除以m的余数只能是0,m-1,根据抽屉原则,当计算m+1次时,至少存在一个余数相同,即为循环节。故我们只需存储余数输出即可。
注意:一开始做输出超限了,因为把小数位数定了5000,余数最多3000个,但不意味最多3000小数位,3000个数位数会大于5000,所以会出错。
代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 50005;int rec[maxn*2], val[maxn*2];int main(void){ int a, b, ca = 1; while(cin >> a >> b) { memset(rec, 0, sizeof(rec)); int x = a%b*10, i; for(i = 1; i < maxn; i++) { if(rec[x]) break; if(!x) break; rec[x] = i; val[i] = x/b; x = x%b*10; } PRintf("Case %d:/n%d/%d=", ca++, a, b); printf("%d.", a/b); if(!x) { for(int j = 1; j < i; j++) printf("%d", val[j]); printf("(0)/n1/n"); } else { //输出不循环的 for(int j = 1; j < rec[x]; j++) printf("%d", val[j]); //循环体超过50 if(i-rec[x] > 50) { printf("("); for(int j = rec[x]; j <= rec[x]+49; j++) printf("%d", val[j]); printf("...)/n"); } //不超过50 else { printf("("); for(int j = rec[x]; j < i; j++) printf("%d", val[j]); printf(")/n"); } printf("%d/n", i-rec[x]); } } return 0;}1357: 小E与计算器
时间限制: 1 Sec 内存限制: 128 MB提交: 147 解决: 20题目描述
小E学完C语言之后,想写一个计算器。刚开始行云流水般把+,-,x功能给写完了。但是遇到了除法,小E就
。万能的ACMer,你能帮助
的小E完成除法功能吗?小E要实现的计算器的除法显示,如表所示:
算式 | 计算器显示结果 | 循环小数的循环体 | 循环体长度 |
1÷2 | 0.5(0) | 0 | 1 |
1÷3 | 0.(3) | 3 | 1 |
2÷7 | 0.(285714) | 285714 | 6 |
(当循环体超过50位,那么多余的部分使用...代替)
输入包括若干组测试用例,每组测试用例包括一行:
第一行包括两个整数a, b(a表示被除数,b表示除数)(1 ≤ a, b ≤ 3000)。
(tips:保证a/b的整数部分不会大于等于10)
输出只有三行。
第一行输出测试样例编号
第二行包括a÷b的计算器显示结果
第三行包括循环体的长度
(具体格式参考样例输出)
1 22 11 97样例输出
Case 1:1/2=0.5(0)1Case 2:2/1=2.(0)1Case 3:1/97=0.(01030927835051546391752577319587628865979381443298...)96
新闻热点
疑难解答