1357: 小E与计算器
时间限制: 1 Sec 内存限制: 128 MB提交: 145 解决: 19
题目描述
小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)
1
Case 2:
2/1=2.(0)
1
Case 3:
1/97=0.(01030927835051546391752577319587628865979381443298...)
96
比赛的时候是懵逼的,怎么求循环体。。。
过了这么久才来补,看了看题解才发现原来这么水。。。
题解:
解决这一题,我们稍微一分析,就能够简化问题。因为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