题目:
数字黑洞:任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。
求这两个数字的差,得:41976,
把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。请编写程序,找到5位数所有可能的循环圈,
解决的思路有两个。
1、从10000到99999,对每个数字进行如下过程:
(1)得到下一个数,存入数组中,
(2)跟之前所有得到的比较,如果没有相同的,说明没有成圈,继续得到下一个数
比如10000->10000-1=9999,9999和10000不同
9999->99990-9999=89991,89991和9999、10000都不同
89991->99981-18999=80982,80982和9999、10000、89991都不同
…………
(3)一直找到有相同的,说明成圈了,则把已成的圈存入一个二维数组。
这个思路会重复计算很多次,比如从10000找到第一个圈,要计算10次左右。那么这十个数字在这一次循环中已经被计算了,而后边依然还要计算
2、定义长为10W的数组,由下标值计算出下一个数,存入数组中。比如
a[1]为10000-1=9999, a[2]=20000-2=19998 …………
如此每个数字只需要计算一次
然后i从1-99999,每个数字进行如下过程:
(1)将数组值变负,(2)将值作为下标,重复这个过程。
比如a[1]值(本为9999)变为-9999,然后a[9999](值89991)变为-89991,然后a[89991]变负…………
直到某个元素值小于零(说明成圈),或者等于零(跳过),。
如果小于零,则将这个圈存入二维数组中,并且从i开始,将刚才这个过程中经过的数字全赋为零,说明此圈已经被找到,如果以后再进入这些数字中的一个(等于零),就直接跳过。
按我自己的想法,应该第二个比第一个思路效率高才对,但运行结果后一种比前一种慢了一倍多。我自己电脑上第一个运行四秒,第二个要九秒多。。。。
那我的想法错哪了?求指点。
数字黑洞:任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。
求这两个数字的差,得:41976,
把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。请编写程序,找到5位数所有可能的循环圈,
解决的思路有两个。
1、从10000到99999,对每个数字进行如下过程:
(1)得到下一个数,存入数组中,
(2)跟之前所有得到的比较,如果没有相同的,说明没有成圈,继续得到下一个数
比如10000->10000-1=9999,9999和10000不同
9999->99990-9999=89991,89991和9999、10000都不同
89991->99981-18999=80982,80982和9999、10000、89991都不同
…………
(3)一直找到有相同的,说明成圈了,则把已成的圈存入一个二维数组。
这个思路会重复计算很多次,比如从10000找到第一个圈,要计算10次左右。那么这十个数字在这一次循环中已经被计算了,而后边依然还要计算
2、定义长为10W的数组,由下标值计算出下一个数,存入数组中。比如
a[1]为10000-1=9999, a[2]=20000-2=19998 …………
如此每个数字只需要计算一次
然后i从1-99999,每个数字进行如下过程:
(1)将数组值变负,(2)将值作为下标,重复这个过程。
比如a[1]值(本为9999)变为-9999,然后a[9999](值89991)变为-89991,然后a[89991]变负…………
直到某个元素值小于零(说明成圈),或者等于零(跳过),。
如果小于零,则将这个圈存入二维数组中,并且从i开始,将刚才这个过程中经过的数字全赋为零,说明此圈已经被找到,如果以后再进入这些数字中的一个(等于零),就直接跳过。
按我自己的想法,应该第二个比第一个思路效率高才对,但运行结果后一种比前一种慢了一倍多。我自己电脑上第一个运行四秒,第二个要九秒多。。。。
那我的想法错哪了?求指点。