时间: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,可能会进行较多不必要的计算。
代码二(