如何在python中找到从1到输入数字x的每个数字的除数立方体之和,其中x可能非常大
使用此代码,我可以找到小于一百万的小数字的答案。 但我想找到非常大的数字的答案。有算法吗如何在python中找到从1到输入数字x的每个数字的除数立方体之和,其中x可能非常大,python,python-2.7,Python,Python 2.7,使用此代码,我可以找到小于一百万的小数字的答案。 但我想找到非常大的数字的答案。有算法吗 对于如何轻松地解决大量问题?我不认为有一种巧妙的方法可以真正有效地解决这个问题,但很容易使整个过程更快。如果将示例视为矩阵,则一次求和一行。这需要,对于每个i,找到i的所有除数并求其立方体的和。总之,这需要一系列与x**2成比例的操作 通过将矩阵按列求和,可以很容易地将其切割成与x成比例的操作数。给定一个整数j,1..x中有多少个整数可被j整除?这很简单:在这个范围内有j的x//j倍数,所以除数j贡献了j*
对于如何轻松地解决大量问题?我不认为有一种巧妙的方法可以真正有效地解决这个问题,但很容易使整个过程更快。如果将示例视为矩阵,则一次求和一行。这需要,对于每个i,找到i的所有除数并求其立方体的和。总之,这需要一系列与x**2成比例的操作 通过将矩阵按列求和,可以很容易地将其切割成与x成比例的操作数。给定一个整数j,1..x中有多少个整数可被j整除?这很简单:在这个范围内有j的x//j倍数,所以除数j贡献了j**3*x//j的总和
Examples,
1.Input=4
Output=111
Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
------------------------
sum = 111(output)
1.Input=5
Output=237
Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
5 = 1³ + 5³(divisors of 5)
-----------------------------
sum = 237 (output)
x=int(raw_input().strip())
tot=0
for i in range(1,x+1):
for j in range(1,i+1):
if(i%j==0):
tot+=j**3
print tot
这运行得更快,但仍然需要与x成比例的时间
有一些较低级别的技巧,你可以通过不断的因素来加速,但总体来说,它们仍然需要很长的时间。例如,请注意,对于所有j,x//j==1,这样x//2def better4(x):
result = 0
for i in range(1, x+1):
d = x // i
if d >= i:
# d is the largest divisor that appears `i` times, and
# all divisors less than `d` also appear at least that
# often. Account for one occurence of each.
result += sum3(d)
else:
i -= 1
lastd = x // i
# We already accounted for i occurrences of all divisors
# < lastd, and all occurrences of divisors >= lastd.
# Account for the rest.
result += sum(j**3 * (x // j - i)
for j in range(1, lastd))
break
return result
对于一些满足0的整数r,我看不到一种巧妙的方法来使其真正有效,但很容易使其速度大大加快。如果将示例视为矩阵,则一次求和一行。这需要,对于每个i,找到i的所有除数并求其立方体的和。总之,这需要一系列与x**2成比例的操作 通过将矩阵按列求和,可以很容易地将其切割成与x成比例的操作数。给定一个整数j,1..x中有多少个整数可被j整除?这很简单:在这个范围内有j的x//j倍数,所以除数j贡献了j**3*x//j的总和
Examples,
1.Input=4
Output=111
Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
------------------------
sum = 111(output)
1.Input=5
Output=237
Explanation,
1 = 1³(divisors of 1)
2 = 1³ + 2³(divisors of 2)
3 = 1³ + 3³(divisors of 3)
4 = 1³ + 2³ + 4³(divisors of 4)
5 = 1³ + 5³(divisors of 5)
-----------------------------
sum = 237 (output)
x=int(raw_input().strip())
tot=0
for i in range(1,x+1):
for j in range(1,i+1):
if(i%j==0):
tot+=j**3
print tot
这运行得更快,但仍然需要与x成比例的时间
有一些较低级别的技巧,你可以通过不断的因素来加速,但总体来说,它们仍然需要很长的时间。例如,请注意,对于所有j,x//j==1,这样x//2def better4(x):
result = 0
for i in range(1, x+1):
d = x // i
if d >= i:
# d is the largest divisor that appears `i` times, and
# all divisors less than `d` also appear at least that
# often. Account for one occurence of each.
result += sum3(d)
else:
i -= 1
lastd = x // i
# We already accounted for i occurrences of all divisors
# < lastd, and all occurrences of divisors >= lastd.
# Account for the rest.
result += sum(j**3 * (x // j - i)
for j in range(1, lastd))
break
return result
对于某些满足0def sum_除数n的整数r:
总和=0
i=0
对于范围1中的i,n:
如果n%i==0且n!=0 :
sum=sum+i
def isqrt(n):
"Return floor(sqrt(n)) for int n > 0."
g = 1 << ((n.bit_length() + 1) >> 1)
d = n // g
while d < g:
g = (d + g) >> 1
d = n // g
return g
def better5(x):
assert x > 0
u = isqrt(x)
v = x // u
return (sum(map(sum3, (x // d for d in range(1, u+1)))) +
sum(x // i * i**3 for i in range(1, v)) -
u * sum3(v-1))
定义和除数n:
总和=0
i=0
对于范围1中的i,n:
如果n%i==0且n!=0 :
sum=sum+i
def isqrt(n):
"Return floor(sqrt(n)) for int n > 0."
g = 1 << ((n.bit_length() + 1) >> 1)
d = n // g
while d < g:
g = (d + g) >> 1
d = n // g
return g
def better5(x):
assert x > 0
u = isqrt(x)
v = x // u
return (sum(map(sum3, (x // d for d in range(1, u+1)))) +
sum(x // i * i**3 for i in range(1, v)) -
u * sum3(v-1))
@maq不,这对于代码审查来说是非常离题的。请参考他们的@maq No,这与代码审查的主题完全无关。请参考他们的。工作做得很好。正如您所说,better31013只需不到一分钟,better31015只需近3分钟。谢谢,工作做得很好。正如您所说,better31013只需不到一分钟,better31015只需近3分钟。非常感谢。
d == x/i
i == x/d
def isqrt(n):
"Return floor(sqrt(n)) for int n > 0."
g = 1 << ((n.bit_length() + 1) >> 1)
d = n // g
while d < g:
g = (d + g) >> 1
d = n // g
return g
def better5(x):
assert x > 0
u = isqrt(x)
v = x // u
return (sum(map(sum3, (x // d for d in range(1, u+1)))) +
sum(x // i * i**3 for i in range(1, v)) -
u * sum3(v-1))
# Return the sum of all divisors of n, not including n
return sum
print(sum_divisors(0))
# 0
print(sum_divisors(3)) # Should sum of 1
# 1
print(sum_divisors(36)) # Should sum of 1+2+3+4+6+9+12+18
# 55
print(sum_divisors(102)) # Should be sum of 2+3+6+17+34+51
# 114