Menu
CoddyTech

196 算法

Coddy 数学谜题 课程的第 20 课,共 20 课。

如果我们取 38,将它反转并相加,38 + 83 = 121,结果是一个回文数。

并非所有数字都能这么快得到回文数。例如:

  1. 37 + 73 = 110
  2. 110 + 11 = 121

也就是说,37 经过两次迭代后才得到回文数。

再看一个例子,从 249 开始:

  1. 249+942=1191
  2. 1191+1911=3102
  3. 3102+2013=5115.

像 11、343 这样的回文数,假定它们经过 0 次迭代就成为回文数。

 

取任意一个正整数,将各位数字反转,然后与原数相加。这个操作称为反转并相加过程。接着,用得到的和重复这个步骤,直到得到回文数。对于大多数整数,这个过程能很快得到回文数。

 

在反转并相加过程中永远不会形成回文数的数字称为 Lychrel 数。最初几个尚不确定是否能产生回文数的数字,也就是“候选 Lychrel 数”,包括 196、295、394。[https://mathworld.wolfram.com/196-Algorithm.html]

challenge icon

挑战

中等

虽然目前还没有人证明这一点,但有些十进制数,例如 196,永远不会得到回文数。在本挑战中,我们先假设一个数是 Lychrel 数,直到证明它不是。小于一万的数要么(i)在不到 50 次迭代内变成回文数,要么(ii)迄今为止,即使动用所有现有的计算能力,也没有人能将它变成回文数。

编写一个函数 isLychrel,接收一个小于 10000 的正整数,并返回它变成回文数所需的迭代次数。

如果迭代次数超过 50 次,则返回 -1。

亲手试试

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "solution.h"

int main() {
    int n;
    if (scanf("%d", &n) != 1) n = 0;
    int r = isLychrel(n);
    printf("%d\n", r);
    return 0;
}

数学谜题中的所有课

自己练习: C 在线编译器