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

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值