1442.埃及分数
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
将一个真分数分解为若干埃及分数的和的形式,要求分解的埃及分数的个数尽量少
埃及分数:分子为1的分数.
输入
7/8
输出
7/8=1/2+1/3+1/24
输入样例
7/8
输出样例
7/8=1/2+1/3+1/24
提示
来源
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int num1,num2;
char str[1000];
int a[1000];
int cnt(int x,int y)
{
int cnt=1;
int ans=0;
for(int i=y;i>=x;i--)
{
ans+=(str[i]-'0')*cnt;
cnt*=10;
}
return ans;
}
void solve(int temp) //分数加减法。
{
num1*=temp;
num1-=1*num2;
num2*=temp;
}
int gcd(int x1,int x2)
{
if(x2==0)
return x1;
else
return gcd(x2,x1%x2);
}
int main()
{
int i;
int temp;
scanf("%s",str);
int len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]=='/')
temp=i;
}
num1=cnt(0,temp-1);
num2=cnt(temp+1,len-1);
printf("%d/%d=",num1,num2);
int countt=0;
while(num1!=1)
{
temp=num2/num1+1; //利用这个加1算法,得到的一定是互质的分子,分母。
solve(temp);
a[++countt]=temp;
int xxx=gcd(num2,num1);
num2/=xxx;
num1/=xxx;
}
a[++countt]=num2;
for(i=1;i<=countt-1;i++)
printf("1/%d+",a[i]);
printf("1/%d\n",a[i]);
return 0;
}