196 算法
Coddy 数学谜题 课程的第 20 课,共 20 课。
如果我们取 38,将它反转并相加,38 + 83 = 121,结果是一个回文数。
并非所有数字都能这么快得到回文数。例如:
- 37 + 73 = 110
- 110 + 11 = 121
也就是说,37 经过两次迭代后才得到回文数。
再看一个例子,从 249 开始:
- 249+942=1191
- 1191+1911=3102
- 3102+2013=5115.
像 11、343 这样的回文数,假定它们经过 0 次迭代就成为回文数。
取任意一个正整数,将各位数字反转,然后与原数相加。这个操作称为反转并相加过程。接着,用得到的和重复这个步骤,直到得到回文数。对于大多数整数,这个过程能很快得到回文数。
在反转并相加过程中永远不会形成回文数的数字称为 Lychrel 数。最初几个尚不确定是否能产生回文数的数字,也就是“候选 Lychrel 数”,包括 196、295、394。[https://mathworld.wolfram.com/196-Algorithm.html]
挑战
中等虽然目前还没有人证明这一点,但有些十进制数,例如 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 在线编译器