不经小曹提醒我是看不出规律了。现在的问题就是已知这一规律后,如何找到这样的数。
直接穷举铁定是不行的,1000位,可以算到宇宙毁灭了。
还是先分析一下这个问题。
设这个数为X,将X拆成两段,前面的数设为A, 最后一位设为B。
即 X = 10A + B
那么这一规律即可表示为 2*(10A + B) = B * 10 ^ [log10(A) + 1] + A
整理一下,即 19 * A = (10 ^ [log10(A) + 1] - 2) * B
设 C = 10 ^ [log10(A) + 1] - 2
上式可表示为
19 * A = C * B
A = B * C / 19
由此,只要找到一对B、C,使得 B * C 能被19整除,就找到了对应的A,从而找到一个满足这一规律的数X。
事实上,19是一个质数,而B是不可能被19整除的(B是个1位十进制数),所以 B * C 能被19整除的充要条件是 C 能被19整除
其中,C 的取值为8、98、998、9998、99998...
再聊聊B的取值。B是个一位数,所以最大范围是 0 到 9
而由题意明显可知,0 是不能取的, 所以是 1 到 9
再分析一下,由C的定义可知, C 的长度是等于 A 的, 所以要求 B * C / 19 的长度也必须等于 A 的长度
所以 B 的值也不能取1。实际上为了使B * C / 19 的长度等于 A 的长度, B的取值范围只能也一定是2 到 9
关于这一点的证明,话比较多,现在太晚了,就不详述了。
这里既然设定X的范围是10000位以内,即C的可取数值有9999个,就算10000个吧
先用大数运算找到能被19整除的C,然后对这样的C乘上可取的B得出A。
以上,便是由对问题的分析导的算法概况。
最后,估计一下算法的执行时间。
在采用10000进制的数来存储C的话,最大的C的长度是2500个单元。
对C进行一次能否被19整除的判定最多需要进行2500次除法运算(加法暂时忽略不计)
对于判定成功的C乘以B即得到A,也就得到了X
由此找到所有的X 一共大约需要进行10000 * 2500 * 7 = 175000000次乘法运算。
这里估计的是算法消耗时间的上限,实际中如果C不能被19整除,那就不需要对其乘B。实际消耗时间应该比上面估计的要少一个数量级。
所以由上面算法实现的程序大概可以在1分钟以内找到10000位以内所有的满足题意要求的数X。
以上只是我个人的思想实现,有什么不足之处还请指正, 各位有更好的想法也请发上来分享。打字花了我不少时间,该休息了。