您的位置:首页 > 其它

华为OJ(将真分数分解为埃及分数)

2015-08-16 15:00 387 查看
题目:将真分数分解为埃及分数

描述
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
接口说明 /*
功能: 将分数分解为埃及分数序列
输入参数:
String pcRealFraction:真分数(格式“8/11”)
返回值:
String pcEgpytFraction:分解后的埃及分数序列(格式“1/2+1/5+1/55+1/100”)
*/ public static String  ConvertRealFractToEgpytFract(String pcRealFraction)
{
return null;
}

知识点字符串
运行时间限制10M
内存限制128
输入输入一个真分数,String型
输出输出分解后的string
样例输入8/11
样例输出1/2+1/5+1/55+1/110
若真分数的分子a能整除分母b,则真分数经过化简就可以得到埃及分数,若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为b/a+1的埃及分数。用这种方法将剩余部分反复分解,最后可得到结果。

网上大多都是这种解法,可能就是一个规律题,前面还好懂,对a=3情况的单独处理不是太懂,下面是代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{
string s,sn,sd;
int a,b,c;
cin>>s;
size_t index=s.find_first_of('/');
sn=s.substr(0,index);
sd=s.substr(index+1,s.size()-index-1);
a=atoi(sn.c_str());
b=atoi(sd.c_str());
while(1)
{
if(b%a)
c=b/a+1;
else
{
c=b/a;
a=1;
}
if(a==1)
{
cout<<"1/"<<c;
break;
}
else
{
cout<<"1/"<<c<<"+";
}
a=a*c-b;
b=b*c;
if(a==3)
{
cout<<"1/"<<b/2<<"+"<<"1/"<<b;
break;
}
}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: