任意输入一个数值:
请输入一个数:2617829 239 94 97 130 10 1 到1开始循环了 请输入一个数:36653728 232 17 50 25 29 85 89 145 42 20 4 到4开始循环了为了更清晰地看到数字的循环规律,我们不妨对100以内的数值进行分析,看看哪些数值能够进入“1循环”,哪些数值能够进入“4循环圈”。
将进入“1循环”的数值找出来,代码如下: sum = 0 for k in range(1,101): sum = 0 a = k for i in range(10000): for j in range(len(str(a))): m = str(a)[j] sum = int(m) *int(m) + sum if sum == 4: break else: if sum == 1: print(k,"到1了") break else: a = sum sum = 0运行结果:
1 到1了 7 到1了 10 到1了 13 到1了 19 到1了 23 到1了 28 到1了 31 到1了 32 到1了 44 到1了 49 到1了 68 到1了 70 到1了 79 到1了 82 到1了 86 到1了 91 到1了 94 到1了 97 到1了 100 到1了 将进入“4循环圈”的数值找出来,代码如下: sum = 0 for k in range(1,101): sum = 0 a = k for i in range(10000): for j in range(len(str(a))): m = str(a)[j] sum = int(m) *int(m) + sum if sum == 4: print(k, "到4了") break else: if sum == 1: break else: a = sum sum = 0运行结果:
2 到4了 3 到4了 4 到4了 5 到4了 6 到4了 8 到4了 9 到4了 11 到4了 12 到4了 14 到4了 15 到4了 16 到4了 17 到4了 18 到4了 20 到4了 21 到4了 22 到4了 24 到4了 25 到4了 26 到4了 27 到4了 29 到4了 30 到4了 33 到4了 34 到4了 35 到4了 36 到4了 37 到4了 38 到4了 39 到4了 40 到4了 41 到4了 42 到4了 43 到4了 45 到4了 46 到4了 47 到4了 48 到4了 50 到4了 51 到4了 52 到4了 53 到4了 54 到4了 55 到4了 56 到4了 57 到4了 58 到4了 59 到4了 60 到4了 61 到4了 62 到4了 63 到4了 64 到4了 65 到4了 66 到4了 67 到4了 69 到4了 71 到4了 72 到4了 73 到4了 74 到4了 75 到4了 76 到4了 77 到4了 78 到4了 80 到4了 81 到4了 83 到4了 84 到4了 85 到4了 87 到4了 88 到4了 89 到4了 90 到4了 92 到4了 93 到4了 95 到4了 96 到4了 98 到4了 99 到4了通过运行程序,我们知道[1,100]的正整数中,循环到1的有1,7,10,13,19,23,28,31,32,44,49,68,70,79,82,86,91,94,97,100,20个数。
如何通过规律把这20个数有理有据地找出来呢?
首先,① 对于正整数1,10,100,毫无疑问,一定是指向1循环的; ② 若一个两位数最终指向1,那么这个两位数调换个位和十位的数值后,也会指向1.
参照费马二平方定理的操作思路: 5 = 1 2 + 2 2 5=1^{2}+2^{2} 5=12+22 13 = 2 2 + 3 2 13=2^{2}+3^{2} 13=22+32 17 = 1 2 + 4 2 17=1^{2}+4^{2} 17=12+42 * 当然,以上引例是基于费马二平方素数,也就是一个素数为两个整数的平方和且两个整数均为素数,即素数F=XX+YY,X,Y皆为素数时,F就是费马二平方素数。基于以上思路以及①②两个规律,我们分别从下面👇这几个路径入手,找寻这些数值的规律——逆向思考1,10,100,可以为哪两个数的平方和,进而不断推出进入“1循环”的正整数。
①… 哪两个正整数的平方和等于10? 10 = 1 2 + 3 2 . 10=1^{2}+3^{2}. 10=12+32. 于是13,31,是指向1的,再来思考13: ②…哪两个正整数的平方和等于13? 13 = 2 2 + 3 2 . 13=2^{2}+3^{2}. 13=22+32. 于是23,32,是指向1的,再来思考32: ③… 哪两个正整数的平方和等于32? 32 = 4 2 + 4 2 . 32=4^{2}+4^{2}. 32=42+42. 于是44,是指向1的.
由此,从10(或者01)出发的路径,我们可以找到1,10,13,31,23,32,44,七个数值。①… 哪两个正整数的平方和等于100? 100 = 6 2 + 8 2 . 100=6^{2}+8^{2}. 100=62+82. 于是68,86,是指向1的,再来思考68: ②…哪两个正整数的平方和等于68? 68 = 2 2 + 8 2 . 68=2^{2}+8^{2}. 68=22+82. 于是28,82,是指向1的,再来思考82: ③… 哪两个正整数的平方和等于82? 82 = 1 2 + 9 2 . 82=1^{2}+9^{2}. 82=12+92. 于是19,91,是指向1的.
由此,从100出发的路径,我们可以找到68,86,28,82,19,91,100,七个数值。我们发现 —— 从以上路径出发,我们已经找到了14个数值了,其实还有一个角度被我们忽略了,100以内的正整数,两个数值的平方和最大时,是个位数字与十位数字是9的时候,也就是99,此时平方和是162,也就是说我们还要思考当100<平方和<162的情况,从以上分析中,有“13”这个两位数,那么指向13和指向130的数值,最终都将指向1。为什么只考虑13后面加一个0呢?因为除了13和1以外,👆上面我们论证出的任何指向1的数值,比如19 ,在后面加一个0后,都不在100<平方和<162的范围内,也就是都不会是两位数的平方和。于是我们又有了第三个路径。
①… 哪两个正整数的平方和等于130? 130 = 7 2 + 9 2 . 130=7^{2}+9^{2}. 130=72+92. 于是79,97,是指向1的,再来思考97: ②…哪两个正整数的平方和等于97? 97 = 4 2 + 9 2 . 97=4^{2}+9^{2}. 97=42+92. 于是49,94,是指向1的,再来思考49: ③… 哪两个整数的平方和等于49? 49 = 0 2 + 7 2 . 49=0^{2}+7^{2}. 49=02+72. 于是7(可以理解为07),70,是指向1的.
由此,从130出发的路径,我们可以找到79,97,49,94,7,70,六个数值。