C++给分数约分

Fraction类中重载的+运算符,实现分数相加的功能类定义如下计算正确但不能约分... Fraction类中重载的+运算符,实现分数相加的功能
类定义如下

计算正确但不能约分
展开
 我来答
忽忽上升
2014-07-12 · TA获得超过1911个赞
知道小有建树答主
回答量:1166
采纳率:70%
帮助的人:567万
展开全部

经过我的跟踪调试,发现你的约分方法有点问题。比如2/5 + 3/5;

经过计算会得出25/25;

约分时遇到5了,然后约分一次,但是约分不会再次从头遍历数组里面的质数(39除外),而是i继续自增了。因此约分的不彻底。

如果需要约分彻底,那么需要对约分进行检测,如果本次遍历进行了约分,那么再次从头遍历一次数组。如果本次遍历没有约分,那么就退出循环。

更多追问追答
追问

感谢回答,容我再思考一下

 

我将程序修改了一下

追答
for(int i=0; i<Size; i++)
{
if((F.dn%arr[i]==0)&&(F.nr%arr[i]==0))
{
F.dn /= arr[i];
F.nr /= arr[i];
i = -1;  //如果进行了约分,则从头开始
}
}

这样就可以有了约分就从头遍历。

但是遍历数组这种方法是行不通的。比如如果计算结果为47/2209,你又没办法约分了,因为你的数组没有包含47。要使得所有数据都能约分,你就得使数组包含所有质数,然而这是不可能的(因为质数有无限个)。所以建议你放弃使用此方法实现约分。porker2008的方法是完美的,分子分母都除以它们的最大公约数就完成了约分。

porker2008
2014-07-12 · TA获得超过1.4万个赞
知道大有可为答主
回答量:7066
采纳率:62%
帮助的人:1.1亿
展开全部
static int greatest_common_divisor(int a, int b) {
int c;
while (b != 0) {
c = a % b;
a = b;
b = c;
}
return a;
}

Fraction Fraction::operator+(const Fraction& Frac) const {
Fraction F;
int cd = greatest_common_divisor(dn, Frac.dn);
F.dn = dn / cd * Frac.dn;
F.nr = Frac.nr * (F.dn / Frac.dn) + nr * (F.dn / dn);
cd = greatest_common_divisor(F.dn, F.nr);
if (cd > 1) {
F.dn /= cd;
F.nr /= cd;
}
return F;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式