Om *_*rma 5 python algorithm math optimization python-3.x
对于给定的数字,N
找到总可能的有序对(x,y),使得x和y小于或等于n,并且x的数字之和小于y的数字之和
例如n = 6:有21
可能的有序对[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 3), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6), (4, 5), (4, 6), (5, 6)]
这里x总是小于y,x的数字之和也小于y的数字之和,x和y都等于或小于N.这是我天真的方法,但这很慢,并且工作正常,直到N = 10000之后它表现不佳.
from itertools import permutations
n=100
lis=list(range(n+1))
y=list(i for i in permutations(lis,2) if i[0]<i[1] and sum(list(map(int,
(list(str(i[0]))))))<sum(list(map(int,(list(str(i[1])))))))
print(len(y))
Run Code Online (Sandbox Code Playgroud)
一个使用发电机
from itertools import permutations
for _ in range(int(input())):
n=1000
lis=range(n+1)
y=(i for i in permutations(lis,2) if i[0]<i[1] and sum(list(map(int,
(list(str(i[0]))))))<sum(list(map(int,(list(str(i[1])))))))
print (sum(1 for _ in y))
Run Code Online (Sandbox Code Playgroud)
更好的改进版本:
from itertools import permutations
for _ in range(int(input())):
n=1000
lis=range(n+1)
y=(i for i in permutations(lis,2) if i[0]<i[1] and sum(map(int,(str(i[0]))))<sum(map(int,(list(str(i[1]))))))
print (sum(1 for _ in y))
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来解决这个问题?
小智 0
def find_total_possible(n):
x = [i for i in range(n + 1)]
y = [i + 1 for i in range(n + 1)
z = list(zip(x,y))
return z
Run Code Online (Sandbox Code Playgroud)
这是作业吗?
闻起来像家庭作业。
归档时间: |
|
查看次数: |
482 次 |
最近记录: |