uva 202 小数循环节

37 篇文章 0 订阅

http://acm.bnu.edu.cn/v3/contest_show.php?cid=5772#problem/G

模仿竖式除法,当某一个余数出现第二次的时候就循环了,用数组保存出现过的余数和余数出现的位置。

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <bitset>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))
#define clr1(x) memset(x,-1,sizeof(x))
typedef long long LL;
const int maxn = 3005;

int r[maxn],u[maxn],s[maxn];

int main()
{
	int n,m,t;
	while (~RD2(n,m)) {
		t = n;
		clr0(r),clr0(u);
		int cnt = 0;
		r[cnt ++] = n/m;
		n = n%m;
		while (!u[n] && n) {
			u[n] = cnt;
			s[cnt] = n;
			r[cnt ++] = 10*n/m;
			n = 10*n%m;
		}
		printf("%d/%d = %d.",t,m,r[0]);
		for (int i = 1;i < cnt && i <= 50;++i) {
			if (n && s[i] == n) printf("(");
			printf("%d",r[i]);
		}
		if (!n) printf("(0");
		if (cnt > 50) printf("...");
		printf(")\n");
		printf("   %d = number of digits in repeating cycle\n\n",n?(cnt-u[n]):1);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值