分类：电脑/网络-程序设计-C/C++
问题：问题又来了。。。bryant1976学长错在最后几句{no=mo 
错在最后几句{ no= mo; mo= no% mo;return fun2(c);}应该改为{Franctn d; no =  mo; mo =  no% mo;return fun2(d);}既然要用辗转相除法来求最大公约数，就要严格保证输入参数的值不能弄错。另外，程序中最好加入一些特殊情况的判断，如 mo不能为零，而如果两个数相等，则会出现分子为零的情况。为什么要重新定义另一个变量d（Franction d;），我不明。我照此修改我的程序，用2/3减去6/5时，程序无结果错在最后几句{ no= mo; mo= no% mo;return fun2(c);}应该改为{Franctn d; no =  mo; mo =  no% mo;return fun2(d);}既然要用辗转相除法来求最大公约数，就要严格保证输入参数的值不能弄错。另外，程序中最好加入一些特殊情况的判断，如 mo不能为零，而如果两个数相等，则会出现分子为零的情况。为什么要重新定义另一个变量d（Franction d;），我不明。我照此修改我的程序，用2/3减去6/5时，程序无结果中止。请指点！
回答：程序必须加负数的判断，为了保证进行比较的都是正数，干脆只比较绝对值。修改如下：
int fun2(Franction c)
{
 mo = abs( mo);
 no = abs( no); //只比较绝对值
if( mo> no)
{
int temp= mo;
 mo= no;
 no=temp;
}
...
}

至于为什么用Franction d;自己调试跟踪一下就明白了。如果按照你原来程序的写法，当执行完 no= mo;后再执行 mo= no% mo时由于 no= mo，结果当然是 mo=0了，这显然是错误的。