发现大家都在玩这个,用 python 写了一个,计算一百万之内的数字还是飞快的(包括结果打印)。
#
coding: utf-8
"""
第二道算法题(500分)
题目要求:双倍超立方数是指一个正整数可以正好被拆分为两种不同的a^3+b^3的方式,
其中a,b均为整数且0<a<=b。对于任何一个指定的 int n, 返回所有的小于等于n的双倍超立方数的个数。
"""
def find_double_cublic_number(max):
cubs = [pow(i, 3 ) for i in range( 1 , int(round(pow(max, 1 . / 3 ))))]
# print cubs
sum_dict = {}
result_list = []
length = len(cubs)
for i in range(length):
for j in range(i + 1 , length):
sum = cubs[i] + cubs[j]
if sum_dict.has_key(sum) and sum <= max:
result_list.append(sum)
print " %d^3 + %d^3 = %d " % (sum_dict[sum][0], sum_dict[sum][ 1 ], sum)
print " %d^3 + %d^3 = %d " % (int(round(pow(cubs[i], 1 . / 3 ))), int(round(pow(cubs[j], 1 . / 3 ))), sum)
else :
sum_dict[sum] = (int(round(pow(cubs[i], 1 . / 3 ))), int(round(pow(cubs[j], 1 . / 3 ))))
return len(result_list)
if __name__ == ' __main__ ' :
n = find_double_cublic_number( 1000000 )
print " --------------------------------/n "
print n, " results found. "
"""
第二道算法题(500分)
题目要求:双倍超立方数是指一个正整数可以正好被拆分为两种不同的a^3+b^3的方式,
其中a,b均为整数且0<a<=b。对于任何一个指定的 int n, 返回所有的小于等于n的双倍超立方数的个数。
"""
def find_double_cublic_number(max):
cubs = [pow(i, 3 ) for i in range( 1 , int(round(pow(max, 1 . / 3 ))))]
# print cubs
sum_dict = {}
result_list = []
length = len(cubs)
for i in range(length):
for j in range(i + 1 , length):
sum = cubs[i] + cubs[j]
if sum_dict.has_key(sum) and sum <= max:
result_list.append(sum)
print " %d^3 + %d^3 = %d " % (sum_dict[sum][0], sum_dict[sum][ 1 ], sum)
print " %d^3 + %d^3 = %d " % (int(round(pow(cubs[i], 1 . / 3 ))), int(round(pow(cubs[j], 1 . / 3 ))), sum)
else :
sum_dict[sum] = (int(round(pow(cubs[i], 1 . / 3 ))), int(round(pow(cubs[j], 1 . / 3 ))))
return len(result_list)
if __name__ == ' __main__ ' :
n = find_double_cublic_number( 1000000 )
print " --------------------------------/n "
print n, " results found. "
输出结果:
>
pythonw
-
u
"
double_cubic_number.py
"
1 ^ 3 + 12 ^ 3 = 1729
9 ^ 3 + 10 ^ 3 = 1729
2 ^ 3 + 16 ^ 3 = 4104
9 ^ 3 + 15 ^ 3 = 4104
2 ^ 3 + 34 ^ 3 = 39312
15 ^ 3 + 33 ^ 3 = 39312
9 ^ 3 + 34 ^ 3 = 40033
16 ^ 3 + 33 ^ 3 = 40033 <
1 ^ 3 + 12 ^ 3 = 1729
9 ^ 3 + 10 ^ 3 = 1729
2 ^ 3 + 16 ^ 3 = 4104
9 ^ 3 + 15 ^ 3 = 4104
2 ^ 3 + 34 ^ 3 = 39312
15 ^ 3 + 33 ^ 3 = 39312
9 ^ 3 + 34 ^ 3 = 40033
16 ^ 3 + 33 ^ 3 = 40033 <