免费论文查重: 大雅 万方 维普 turnitin paperpass

阐述大数求大数花朵数新思路

最后更新时间:2024-04-07 作者:用户投稿原创标记本站原创 点赞:23385 浏览:106940
论文导读:我们再来看一个反例:两个数字2、4,分别出现2、1次。num_time,num_time的值分别为2、1,计算2^3 + 2^3 + 4^3 = 80。结果中8,0两个数字分别出现1、1次,与num_time,num_time的值不同,所以不是结果。时间复杂度分析:如果仅从循环次数上看,对于n位数,常规算法循环次数为:10^n次。而本算法循环次数为:n^10次。则
【摘 要】对于超过整形范围的大数花朵数,随着位数的增长,所需时间以指数级增加,而且需要用大数加法和大数乘法来实现,效率非常低下。本文提出一个算法,去掉了重复计算的情况,可以大大提高问题的效率。
【关键词】花朵数 C语言 大数加法
所谓花朵数,就是其各个位的位数次方之和等于其自身的整数。比如三位数153 = 1^3 + 3^3 + 5^3,四位数1634 = 1^4 + 6^4 + 3^4 + 4^4。朵数的常规算法为:对每个数字分别取出各个位,求出幂后相加,再判断是否和原数相同。当位数为n时,此算法时间复杂度为10^n。而此算法的效率低下的原因是,计算了多次重复的情况,比如153、135、315、351、513、531这六个数,一共计算了六次,但实际上只要计算一次就可以了。所以本文提出的新算法,核心思路就是去掉这些重复的情况。具体以求3位花朵数来说明:
在一个3位数中,0-9每个数可能出现的次数是0-3次共4种情况(不考虑最高位为0的情况),也就是说,如果0-9十个数字出现的次数(可能为0)之和为3,那么这就是一个“去掉了重复情况的3位数”,比如1、5、3各出现1次,而其他七个数字出现次数都为0,我们用数组num_time来存放十个次数,则有
num_time下标
十个次数之和sum(num_time)的值为1+1+1=3,说明这是一个三位数。那么这种情况有六种可能:153、135、315、351、513、531。如果按正常的算法从100循环到999,那么要判断6次,而现在只要判断一次。那么这就是一个去掉了重复情况的三位数。现在我们只要求出三个数的三次方,并加起来得到一个值,然后由这个值去判断。也就是:
1^3 + 3^3 + 5^3 = 153,在这个结果153中,各个位数出现的次数为:
这个结果,和Num_time中的值是一致的。这就说明这个结果是一个符合条件的结果,并且这个结果只可能是上面六种中的一个,也就是我们需要的一个结果。如果十个次数之和不为3,说明不是3位数,那么跳过就可以了。
下面我们再来看一个反例:两个数字2、4,分别出现2、1次。num_time,num_time[4]的值分别为2、1,计算2^3 + 2^3 + 4^3 = 80。结果中8,0两个数字分别出现

1、1次,与num_time,num_time[4]的值不同,所以不是结果。

时间复杂度分析:
如果仅从循环次数上看,对于n位数,常规算法循环次数为:10^n次。而本算法循环次数为:n^10次。则可得出结论:
(1)n>10时,本算法计算量大于常规算法
(2)n=10时,二者计算量相同
(3)n>10时,本算法计算量小于常规算法
而实际上,常规算法每次循环都要计算,而本算法中如果次数之和不为n则跳过。所以当n较大时,效率大大提高。所以对于本题,提出的算法是穷举:把每个数字出现次数穷举出来,挑出共21次的情况来判断。具体如下:
(1)十重循环(0-9),让十个数字从0-21循环。也就是说,第i层循环的第j次,表示i这个数字在21位数中出现的次数。
(2)将十个次数加起来,如果是21,说明组成了一个21位数,如果不是21,则跳过。也可以设九重循环,最后一次的次数为21减去之前的次数和。当然,因为总次数不能大于21,所以每一重循环先判断当前次数和是否超过21,若是,则跳过。
(3)按照要求,把它的各位的21次方相加,算出一个值,如果得到的也是21位数并且其各个位数出现次数与循环中出现的一样,说明这就是一个符合要求的结果,输出。
注:
(1)在求各位的21次方时,使用的是大数相加的方法,用字符串来模拟加法过程。
(2) 9在21位数中出现的次数不能超过9。因为(9^21)*10的结果已经是22位了。所以此重循环只到9。
(3)大数加法很费时间,为了效率,可以将10个数的21次方先求出来,放入二维数组power_21中,使用时直接用。这个用init()完成。
(4)reverse()用于将字符串反转,用于大数加法。
(5)大数加法思路:用三个字符串存放两个加数与结果。
每次将两个数字相应的位相加,再加上低一位的进位。比如:
189
+257
--论文导读:
-----
以第二位为例:应为8+5+1(1为低一位的进位)。其和放在bit中。而个位相加没有进位,所以将bit初值设0。
结果有两种情况:
(1)bit>10:则result相应位存入bit的个位,bit的十位留在bit中,作为高一位的进位。
(2)bit<10:则result相应位存入bit的个位,bit置0。
这两种情况都可以用bit%10和bit/10来表示。
位数少的数(a)结束后,有这种情况要分别处理
(1)a的最高位相加后无进位,eg.7+1<10。
74
+9911
--------
只需将b后边的内容直接复制到result即可。
(2)a的最高位相加后有进位,且b相应的下面位全是9。
74
+9981
--------
则将所有连续的9全部置为0。后边进位为1。
(3)a的最高位相加后有进位,且b相应的下面有若干个9,后边还有。
74
+219981
--------
则将所有连续的9全部置为0。下一位为b的值+1,然后将b中剩余内容复制到result中。
(4)a的最高位相加后有进位,且b相应摘自:学年论文范文www.7ctime.com
的下面位不是9。
74
+2181
--------
下一位为b的值+1,然后将b中剩余内容复制到result。