UVa 202 - Repeating Decimals

题意:求出两数字相除的循环小数以及循环节的长度。可以通过判断余数是否相同来判断一个循环的结束。设定一个数组,数组的标号表示可能出现的余数,设置一个变量count,当序号所表示的余数出现时将count值附上去作为标记,也方便统计循环节的长度。

#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define MAX 10000
int main()
{
	int a, b, i, length, mark;//mark用来标记进入循环时的位置 
	char ans[MAX];
	int list[MAX];//存储序号的数组 
	int count;
	while(scanf("%d %d", &a, &b)!=EOF)
	{
		count = 1;
		length = 1;
		mark=-1;
		memset(ans, 0, sizeof(ans));
		memset(list, 0, sizeof(list));
		i = a/b;
		printf("%d/%d = %d.", a, b, i);
		a = a%b;
		while(a!=0)
		{
			if(list[a] == 0)
			{
				list[a]=count;
				ans[count] = 10*a/b + '0';
				count++;
				a = 10*a%b;
				continue;
			}
			else if(list[a]!=0)
			{
				length = count - list[a]; 
				mark = list[a];
				break;
			}
		}
		for(int i=1; i<count && i<=50; i++)
		{
			if(i == mark)
				printf("(");
			printf("%c", ans[i]);
		}
		if(a==0)
			printf("(0");
		if(count>50)
			printf("...");
		printf(")\n");
		printf("   %d = number of digits in repeating cycle\n\n", length);
	}
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值