section 2.4.5 fracdec

这道题相比前几道题来说,没有图,没有别的复杂算法,只是一个模拟计算过程。将结果分为两类,有限和无限循环小数。先将整数部分求出来,0或者是别的整数,然后开始求小数部分,小数部分分为循环节前和循环节后,须将他们依次求出。代码如下。

#include<bits/stdc++.h>
using namespace std;
int bas[100000];
int repeat(int x){
	if (bas[x]==2){
		return 1;
	}
	else return 0;
}
int main (){
	freopen ("fracdec.in","r",stdin);
	freopen ("fracdec.out","w",stdout);
	int a=0,d=0;
	int ans[100000],local[100000];
	memset (ans,0,sizeof(ans));
	memset (local,0,sizeof(local));
	cin>>a>>d;
	int k=a/d,cnt=0;
	if (k==0){
		cnt=1;
	}
	while (k!=0){
		k=k/10;
		cnt++;
	}
	cout<<a/d<<'.';
	cnt++;
	a=a%d;
	bas[a]=1;
	int i=1;
	while (a!=0&&!repeat(a)){
		local[a]=i;
		a=a*10;
		ans[i]=a/d;
		a=a%d;
		bas[a]++;
		i++;
	}
	if (i==1){
		cout<<'0'<<endl;
		return 0;
	}
	if (a==0){
		for (int j=1;j<i;j++){
			cout<<ans[j];
		}
		cout<<endl;
		return 0;
	}
	for (int j=1;j<local[a];j++){
		cout<<ans[j];
		cnt++;
	}
	cout<<'(';
	cnt++;
	for (int j=local[a];j<i;j++){
		if (cnt%76==0){
			cout<<endl;
		}
		cout<<ans[j];
		cnt++;
	}
	cout<<')'<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值