埃及分数(附带注释)

埃及分数

题目

埃及分数:分子为1的分数。 将输入的分数转换为埃及分数和的形式。要求用最少的埃及分数之和表示。

输入格式:
第1行输入分子m和分母n

输出格式:
首先原样输出该分数,然后输出等于号,再输出它的埃及分数的加法之和。

输入样例1:
在这里给出一组输入。例如:

7 8

输出样例1:
在这里给出相应的输出。例如:

7/8=1/2+1/3+1/24

输入样例2:
在这里给出一组输入。例如:

11 7

输出样例2:
在这里给出相应的输出。例如:

11/7=1/1+1/2+1/14

答案

	#include<iostream>
	#include<algorithm>
	using namespace std;
	
	int handle(int x,int y)//求最大公因数 
	{
		while(x!=0&&y!=0)
		{
			if(x%y==0) return y;
			int tmp=x%y;
			x=y;
			y=tmp;	
		}
	}
	
	int main()
	{
		int num1,num2;//num1为分子,num2为分母 
		cin>>num1>>num2;
		int cnt=num1/num2;//计算整数部分 
		cout<<num1<<'/'<<num2<<"=";
		int flag=1;
		for(int i=0;i<cnt;i++)//输出整数部分 
		{
			if(flag) flag=0;
			else cout<<'+';
			cout<<"1/1";
		}
		num1-=cnt*num2;
		int num=2;
		while(1)
		{
			if((double)num1/(double)num2>=1/(double)num)//注意判断符号为 >= 
			{
				int tmp=num2*num/handle(num2,num);//求最小公倍数 
				num1=num1*(tmp/num2)-(tmp/num);// 对于7/8-1/2,分子等于7*(8/8)-1*(8/2)=3
				num2=tmp;
				if(flag) flag=0;
				else cout<<'+';
				cout<<"1/"<<num;
				if(num1==0) break;
				tmp=handle(num1,num2);//每次计算后都要进行约分 
				num1/=tmp;
				num2/=tmp;
			}
			num++;//自增 
		}
	}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值