我需要用C语言编写一个带有169算法的程序。但是,在程序崩溃之前,我似乎得到一个无限循环。
对于任何自然数n
,“反转和添加”的操作包括反转n
的数字并将其相加
值n
。例如,考虑n = 345
。反转其数字我们得到数字543
。现在我们必须将n
添加到此数字,即
n + 543 = 345 + 543 = 888
。对于大多数自然数,这个过程反复重复,最终产生一个数字
回文。例如,数字59
生成序列59
,154
,605
和1111
,(59 + 95) = 154
,(154 + 451) = 605
,和(605 + 506) = 1111
。该函数可以假设对函数的初始调用将始终使用一个数字来完成,该数字在某些时候获得回文数。
这是迄今为止的代码:
int invert_int(int n, int m) {
int div = n / 10; //Divide n by 10
if (div == 0)
return (n + m * 10); //If the division is equal to 0, then return n*+m*10
return (invert_int(div, n % 10 + m * 10)); //If not, calculate the inverse of it again
}
int calc(int num) {
int sum = 0; //Declare sum as 0
int inum = invert_int(num, 0); //Calculate the inverse of num by calling invert_int, having the number and 0 as parameters
//If num=inum, then it's a palindrome
if (num == inum) {
return sum; //Return sum to end
} else {
sum = num + inum; //sum = number + inverted number
printf("%d + %d = %d", num, inum, sum); //Print the previous sum
sum = sum + calc(num); //Add the next number to sum
return sum;
}
}
int main(int argc, char** argv) {
int input; //Declare variable to store the user's input
printf("Introduce a number:");
scanf("%d", &input); //Scan a number
printf("%d", calc(input)); //Print the result of the calculation by calling calc with 'input' as argument
return (EXIT_SUCCESS);
}
我似乎没有在这里看到问题。有人能帮助我吗?提前谢谢。
答案 0 :(得分:1)
您的calc
方法应为
int calc(int num){
int sum = 0; //Declare sum as 0
int inum = invert_int(num,0); //Calculate the inverse of num by calling invert_int, having the number and 0 as parameters
//If num=inum, then it's a palindrome
if(num==inum){
return num; //Return sum to end <--- change here
}else{
sum=num+inum; //sum = number + inverted number
printf("%d + %d = %d",num,inum,sum); //Print the previous sum
return calc(sum); <--- just call `calc` again.
}
}
之前您使用错误的参数调用calc
,并且每次使用相同的数字进行分支,但下一次调用永远不会相同。无需在sum = sum + calc(num);
中再次传递calc()
数字。这创造了无限循环。
另外,为了解释我所做的更改 - 无论何时你在运行算法时都是这样 - 你首先计算数字和反向数字,然后你检查了两个。如果他们不匹配你是否通过实数?不,你传递了它们的总和以及这里正在做的事情。