C语言中的169算法

时间:2018-02-14 16:15:03

标签: c recursion

我需要用C语言编写一个带有169算法的程序。但是,在程序崩溃之前,我似乎得到一个无限循环。

对于任何自然数n,“反转和添加”的操作包括反转n的数字并将其相加 值n。例如,考虑n = 345。反转其数字我们得到数字543。现在我们必须将n添加到此数字,即 n + 543 = 345 + 543 = 888。对于大多数自然数,这个过程反复重复,最终产生一个数字 回文。例如,数字59生成序列591546051111(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);
}

我似乎没有在这里看到问题。有人能帮助我吗?提前谢谢。

1 个答案:

答案 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()数字。这创造了无限循环。

另外,为了解释我所做的更改 - 无论何时你在运行算法时都是这样 - 你首先计算数字和反向数字,然后你检查了两个。如果他们不匹配你是否通过实数?不,你传递了它们的总和以及这里正在做的事情。