时间:2024.12.14
6-1 弹球距离


double dist (double h,double p)
{double sum = h,height;height = h*p;while(height>=TOL){sum += height * 2; //上行下行都算,所以是两倍的距离。height *=p;}return sum;
}
6-2 使用函数输出一个整数的逆序数


错误代码:运行超时
int reverse( int number ){int re=0,l;l=number;while(l!=0){re+=l%10;l=number/10;}
return re;
}
-
问题分析
- 原代码中的问题在于循环条件和计算逆序数的逻辑有误。在原代码中,
while
循环的条件是l!=0
,但是在循环体内部,l
的值没有正确更新。每次循环时,l
都被重新赋值为number/10
,而不是l/10
,这导致循环可能无法正确结束,从而导致运行超时。 - 另外,计算逆序数的逻辑也不正确。原代码中
re += l % 10
只是将l
的最后一位加到re
上,并没有实现逆序的效果。
正确代码
int reverse(int number) {int re = 0;while (number!= 0) {re = re * 10 + number % 10;number /= 10;}return re;}
- 在改正后的代码中,
while
循环的条件是number!= 0
,并且在循环体内部,number
的值正确地更新为number/10
(这里使用/=
运算符简化了代码)。 - 计算逆序数的逻辑是
re = re * 10+number % 10
,这会将number
的最后一位取出来并添加到re
的最后一位,通过每次循环将re
乘以 10 来实现逆序的效果。
6-3 使用函数求最大公约数


代码一
int gcd( int x, int y ){int re,min,i,max;min=x>y?y:x;max=x>y?x:y;for(i=min;i>1;i--){if(max%i==0&&min%i==0){re=i;break;}}if(x==1&&y==1){re=1;}return re;
}
代码一思路分析
- 原代码的思路是先找到
x
和y
中的较小值min
和较大值max
,然后从min
开始递减循环,找到第一个能同时整除max
和min
的数,即为最大公约数。如果x
和y
都为 1,则直接返回 1。 - 存在的问题是循环从
min
递减到 1,可能会进行较多不必要的计算。
代码二(