python程序无法理解

先引入问题:
两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。

输入格式:无
输出格式:3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号),一对亲密数只输出一次, 小的在前

这是在网站上的一段python题解:

for i in range(1,3000):
    s=k=0
    # 计算 i 的真因数和
    for j in range(1,i):
        if i % j == 0:
            s += j
    # 计算 s 的真因数和
    for x in range(1, s):
        if s % x == 0:
            k += x
    # 判断是否构成一组亲密数
    if i == k and i < s:
        # 输出亲密数
        print("({:d},{:d})".format(i, s), end="")

我无法理解这段代码的原因是:为什么计算s的真因数和,s不是i的真因数和吗,两者有什么关系?为什么可以这样计算,而不是在3000以内寻找真因数和是i的数?

  • 您的代码有这样子的输出

    img


      经过验证,输出是正确的。之前是我弄错了亲密数定义。🤣

  我试着阅读您的代码先。粗粗“走读”两遍,也是有些懵逼的🤣🤣


  • 我的看法——

      亲密数定义是a的真因子和 == b and b的真因子和 == a 。i为a,那么b最大s了,所以在s以内找b的算法比在3000找寻,优化太多了。

for i in range(1,3000):
    s=k=0
    # 计算 i 的真因数和
    for j in range(1,i):
        if i % j == 0:
            s += j
    # 计算 s 的真因数和
    for x in range(1, s): # 亲密数定义是a的真因子和 == b and b的真因子和 == a 。i为a,那么b最大s了,所以在s以内找b的算法比在3000找寻,优化太多了。
        if s % x == 0:
            k += x
    # 判断是否构成一组亲密数
    if i == k and i < s:
        # 输出亲密数
        print("({:d},{:d})".format(i, s), end="")


  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7655656
  • 除此之外, 这篇博客: Python练习题——第八题:有两个磁盘文件A和B,各存放一行字符串,要求首先把小写字母全部转换成大写字母,然后再把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中中的 有两个磁盘文件A和B,各存放一行字符串,要求首先把小写字母全部转换成大写字母,然后再把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #2019/12/26/18:16
    #自己创建三个txt文件;调用upper函数变成大写;合并;导入到第三个文件
    
    a=open(r'D:\(1).txt','r+')#用读写模式打开 r+ 写入时可覆盖,指定文件路径要有r''
    for char in a:
    	if(char>='a' and char<='z'):
    		char=str.upper(char)
    a.seek(0)#从头开始写入,(0代表从头开始,1代表当前位置,2代表文件最末尾位置。)
    a.write(str(char))
    a.close()
    b=open(r'D:\(2).txt','r+')
    for char in b:
    	if(char>='a' and char<='z'):
    		char=str.upper(char)
    b.seek(0) # 同上,用于移动文件读取指针到指定位置。即从头开始写入
    b.write(str(char))
    b.close()
    a=open(r'D:\(1).txt','r')
    b=open(r'D:\(2).txt','r')
    c=open(r'D:\(3).txt','r+')
    listc=[]
    for i in a.read():
    	listc.append(str(i))
    for j in b.read():
    	listc.append(str(j))
    print(listc)
    print(sorted(listc)) #查看排好序的结果
    for item in sorted(listc):
    	c.write(item) #把结果插入列表中
    c.close()