UVa 202 - Repeating Decimals(AC)

题目网址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=138

解题的话模拟除法,出现两个相同的模(%b)的时候就出现了一个cycle。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cstdio>
using namespace std;
int mod[3001]; // 记录每次对b取模之后的值的位置
int main()
{
	int a, b;
	while (cin >> a >> b)
	{
		for (int i = 0; i < 3001; i++)
			mod[i]=-1;
		string ans = "";
		cout << a << '/' << b << " = ";
		int div = a / b;
		cout << div;
		cout << '.';
		int subs = a;
		int first = -1, len = 1;
		char ch = ' ';
		while (1)
		{
			subs %= b;
			if(mod[subs]==-1) mod[subs]=ans.size(); // 第一次出现某个 模 值
			else // 出现cycle
			{
				len=ans.size()-mod[subs];// 记录cycle的长度
				ch=div+48;
				ans+=ch;
				int i;
				for( i= 1;i<=ans.size();i++)
				{
					if(mod[subs]==i-1) {
						cout<<'(';
						break;
					}
					if(ans[i]>='0'&&ans[i]<='9') cout<<ans[i];
				}
				int j=0;
				for( i ; i<=ans.size()&&j<50;i++)
				{
					if(ans[i]>='0'&&ans[i]<='9') cout<<ans[i],j++;
				}
				if(len>50) cout<<"..."; //cycle长度超过50就要输出 ...了.
				cout<<')'<<endl;
				break;
			}
			ch=div+48;
			ans += ch;
			subs *= 10;
			div = subs / b;
		}
		cout << "   " << len << " = number of digits in repeating cycle\n";
	}
//	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值