题目
埃及分数:分子为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++;//自增
}
}