分数转小数C++

4.15更新 除法:被除数/输出=商…余数,其实余数就相当于被除数,除法写的更平常化一点,应该是,余数/除数=商…余数。那么当余数相同时,除数又不变,那么商必然重复,也因此,可以通过余数相等,来断定出现了循环节。图片来源于百度百科。
在这里插入图片描述


题目描述:编写程序,接受3个以N/D形式输入的分数,其中N(0<=N<=65535)为分子,D(0<=D<=65535)为分母,输出它们的小数形式。如果小数形式存在循环节,则用括号括起来。如1/3=.3333…表示为.(3)。
输入用例
8/5 1/3 11/13
输出用例
8/5=1.6
1/3=.(3)
11/13=.(846153)
思路:当有余数与之前余数相同时则表明发生循环。刚开始无思路参考他人博客,其实根本原因在于根本就不会判断什么样的分数是有循环节的。
参考博客:
参考1参考2
代码:

#include<iostream>
using namespace std;
struct Fraction{
	int numerator;//分子 
	int denominator;//分母 
	int integer;//整数部分 
	int decimal[100]={0};//小数部分 
};
int main(){
	Fraction fra[3];
	for(int i=0;i<3;i++) scanf("%d/%d",&fra[i].numerator,&fra[i].denominator);
	for(int i=0;i<3;i++){
		int r[101]={0};//存储余数 
		printf("%d/%d=",fra[i].numerator,fra[i].denominator);
		fra[i].integer=fra[i].numerator/fra[i].denominator;
		int cnt=0,flag=-1;//cnt小数位数 flag记录循环开始的数字 
		r[cnt]=fra[i].numerator%fra[i].denominator;//得到余数
		while(r[cnt]){
			fra[i].decimal[cnt]=r[cnt]*10/fra[i].denominator;//得到第cnt位小数
			for(int j=0;j<cnt;j++){
				if(r[j]==r[cnt]) {flag=j;break; }//若有此余数与之前余数相等 则发生循环 
			}
			if(flag!=-1) break;
			cnt++;
			r[cnt]=r[cnt-1]*10%fra[i].denominator;
		}
		if(fra[i].integer!=0) cout<<fra[i].integer;//整数部分不为0时输出
		cout<<".";//小数点
		for(int j=0;j<cnt;j++){
			if(j==flag) cout<<"("<<fra[i].decimal[j];
			else cout<<fra[i].decimal[j];
		} 
		if(flag==-1) cout<<endl;//flag=-1表明无循环节 
		else cout<<")"<<endl;
	}
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值