您的位置:首页 > 其它

小紫书 习题 3-8(UVA 202) 循环小数(Repeating Decimals)

2015-11-08 18:34 435 查看
n除以m的余数只能是0~m-1,根据鸽笼原理,当计算m+1次时至少存在一个余数相同,
即为循环节;存储余数和除数,输出即可。

额,就是模拟题,具体过程就模拟除法的运算就好。

嗯,,,输出应该是一次会输入多组数据,被这里卡了一下,读错了一句题意,被卡了一下(活该我没过六级),好久没做题,手生了。。。

AC代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
int chu[3000], yu[3000];
int main()
{
int a, b;
while (scanf("%d%d", &a, &b) != EOF)
{
int t1, t2, t3, length = 0, cycle = -1, begin = -1;
memset(chu, 0, sizeof(int) * 3000);
memset(yu, 0, sizeof(int) * 3000);
t2 = a / b;
t3 = a%b;
printf("%d/%d = %d", a, b, t2);
if (t3 == 0)
{
printf(".(0)\n   1 = number of digits in repeating cycle\n\n");
}
else
{
printf(".");
while (1)
{
yu[length] = t3;
t1 = t3 * 10;
chu[length++] = t1 / b;
t3 = t1%b;
if (t3 == 0)
break;
else
{
bool flag = 0;
for (int i = 0; i < length; i++)
if (t3 == yu[i])
{
flag = 1;
begin = i;
cycle = length - begin;
break;
}
if (flag)
break;
}
}
if (begin == -1)
{
if (length <= 50)
{
for (int i = 0; i < length; i++)
printf("%d", chu[i]);
}
else
{
for (int i = 0; i < 50; i++)
printf("%d", chu[i]);
printf("...");
}
printf("(0)\n   1 = number of digits in repeating cycle\n\n");
}
else
{
for (int i = 0; i < begin; i++)
printf("%d", chu[i]);
printf("(");
if (begin + cycle >= 50)
{
for (int i = begin; i < 50; i++)
printf("%d", chu[i]);
printf("...)\n   %d = number of digits in repeating cycle\n\n", cycle);
}
else
{
for (int i = begin; i < length; i++)
printf("%d", chu[i]);
printf(")\n   %d = number of digits in repeating cycle\n\n", cycle);
}
}
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: