先引入问题:
两个不同的自然数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的数?
我试着阅读您的代码先。粗粗“走读”两遍,也是有些懵逼的🤣🤣
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="")
#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()