新农村建设举报网站,网站系统找不到指定的文件,最便宜的网站叫什么名字,网页设计实验报告实验步骤完整源代码项目地址#xff0c;关注博主私信源代码后可获取
1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展
1#xff0e;问题描述
如果一个整数等于其各个数字的立方和#xff0c;则该数称为“阿姆斯特朗数”#xff08;亦称为自恋性数#xff…完整源代码项目地址关注博主私信源代码后可获取
1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展
1问题描述
如果一个整数等于其各个数字的立方和则该数称为“阿姆斯特朗数”亦称为自恋性数。如 153 1 3 5 3 3 3 1531^35^33^3 153135333,就是一个“阿姆斯特朗数”。试编程求1000以内的所有“阿姆斯特朗数”。
2问题分析
“阿姆斯特朗数”与3.2节中的“水仙花数”的不同在于前者并没有规定几位数从两者的定义来看“水仙花数”可以看作是“阿姆斯特朗数”的一个子集。对于这类问题的算法与“水仙花数”类似需要把每一位分离出来然后比较其立方和与原数是否相等。
3算法设计
本题求的是1000以内满足条件的数从数的位数来说可以分为一位数、两位数及三位数。这样可以根据数的位数不同分别求出不同范围内的“阿姆斯特朗数”即一位数19、两位数1099和三位数100999分别用一个循环语句来实现。
上述方法有其局限性如果题目改成求1 000 000以内甚至更大范围的话程序里面会有多个循环不但程序看起来烦琐写起来也费事更重要的是每个循环体做的事情都是一样的将数的每一位拆分。对于这种重复的事情可以考虑用循环将其简化。对于一个数无论它的位数是多少如果要将其拆分要么按从低位到高位的顺序要么按从高位到低位的顺序。本题按从低位到高位的顺序进行拆分。
从低位到高位进行拆分每次拆分的都是当前数的个位可以用当前数n对10求模即n%10这样最后一位就被分离出来再次分离的是原数的次低位对于次低位要想办法让其成为新数的最低位可采用原数n对10求商的方法即n//10。其他位置的数据求法同上。
题目给出的数据最多三位我们可以定义三个变量分别来存储原数的个位、十位和百位也可以用数组来存储数组的长度为3。
4确定程序框架
程序流程图如图所示。 5完整的程序
%%time
# 阿姆斯特朗数if __name__ __main__:a [0, 0, 0] # 列表a用来存储被拆分的数的个位、十位和百位print(1000以内的阿姆斯特朗数)for i in range(2, 1000):t 0k i# 按从低位到高位的顺序拆分数while k:a[t] k % 10k k // 10t 1sum a[0]**3 a[1]**3 a[2]**3if i sum:print(%d \t %i, end\n)
1000以内的阿姆斯特朗数
153
370
371
407
CPU times: user 4.22 ms, sys: 31 µs, total: 4.25 ms
Wall time: 3.71 ms6问题拓展
本题程序采用的是从低位到高位的顺序进行分离。下面将从高位到低位顺序进行拆分的程序段给出供读者参考。
%%time
# 阿姆斯特朗数if __name__ __main__:a [0, 0, 0] # 列表a用来存储被拆分的数的个位、十位和百位print(1000以内的阿姆斯特朗数)for i in range(2, 1000):# 按从高位到低位的顺序拆分数t 0k 1000while k 10:a[t] (i % k) // (k // 10)k k // 10t 1sum a[0]**3 a[1]**3 a[2]**3if i sum: # 判断是否为阿姆斯特朗数print(%d \t %i, end\n)
1000以内的阿姆斯特朗数
153
370
371
407
CPU times: user 4.85 ms, sys: 324 µs, total: 5.18 ms
Wall time: 4.53 ms