# -*- coding: utf-8 -*-
"""created on thu nov 17 16:52:17 2016
@author: alis
"""'''趣味百題之趣味整數'''
# 求乙個數的所有因子
def factors(num):
p = 1
q = num
a =
while p < q:
if num % p == 0:
p += 1
q = num/p
a.sort()
return a
z = factors(1054)
#1、0-9這10個數字可以組成多少不重複的3位數?
count = 0
for i in range(1,10):
for j in range(10):
if (i == j):continue # 如果 i==j ,過濾
for k in range(10):
if (i != k) and (j != k):
print i,j,k
count += 1
print count
'''2 水仙花數是指乙個n位數(n≥3),它的每個位上的數字的n次冪之和等於它本身。
例如:1^3+5^3+3^3=153。
求100~999之間所有的水仙花數。'''
for i in range(100,1000):
num2str = str(i)
mat = list(num2str)
z = (int(mat[0]))**3 + (int(mat[1]))**3 + (int(mat[2]))**3
if z == i:
print "%d 是水仙花數!" %i
'''3. 完全數(perfect number),又稱完美數或完備數,是一些特殊的自然數。它所有的真因子
(即除了自身以外的約數)的和(即因子函式),恰好等於它本身。例如,第乙個完全數是6,
它有約數1、2、3、6,除去它本身6外,其餘3個數相加,1+2+3=6。第二個完全數是28,
它有約數1、2、4、7、14、28,除去它本身28外,其餘5個數相加,1+2+4+7+14=28。
程式設計求10000以內的完全數。 '''
# 方法1
from numpy import *
import time
begin_time = time.clock()
for i in range(2,50000):
z = int(sqrt(i))
vector =
for j in range(1,z+1):
if mod(i,j) == 0:
temp = i/j
vector.sort()
del vector[-1]
if sum(vector) == i:
print "%d 是完全數" %i
end_time = time.clock()
print "執行時間為%f"%(end_time - begin_time)
#方法2
begin_time = time.clock()
for i in range(2,500000):
z = factors(i)
del z[-1]
if sum(z) == i:
print "%d 是完全數" %i
end_time = time.clock()
print "執行時間為%f"%(end_time - begin_time)
'''4. 220的真因數之和為1+2+4+5+10+11+20+22+44+55+110=284
284的真因數之和為1+2+4+71+142=220
畢達哥拉斯把這樣的數對a、b稱為相親數:a的真因數之和為b,而b的真因數之和為a。
求100000以內的相親數。'''
#方法一:
begin_time = time.clock()
def find_num(num):
sqi = int(sqrt(num))
mat =
for j in range(1,sqi+1):
if mod(num,j) == 0:
temp = num/j
mat.sort()
del mat[-1]
sum_mat = sum(mat)
return sum_mat
for i in range(2,100000):
sum1 = find_num(i)
sum2 = find_num(sum1)
if i == sum2:
print "%d 與 %d 是相親數" %(sum1,sum2)
end_time = time.clock()
print (end_time - begin_time)
#方法2
begin_time = time.time()
def sumoffactors(k):
p = 1
q = k
s = 0
a =
while p < q:
if k % p == 0:
s += p + q
p += 1
q = k / p
if k == p * q and p == q:
s += p
return s - k
def fun(start, end):
for x in range(start, end):
y = sumoffactors(x)
if x < y and sumoffactors(y) == x:
print x, y
fun(2, 100000)
end_time = time.time()
print (end_time - begin_time)
'''5.
黑洞數又稱陷阱數,是類具有奇特轉換特性的整數。任何乙個數字不全相同的整數,經有
限「重排求差」操作,總會得到某乙個或一些數,這些數即為黑洞數。「重排求差」操作即把組成
該數的數字重排後得到的最大數減去重排後得到的最小數。
舉個例子,3位數的黑洞數為495.
簡易推導過程:隨便找個數,如297,3個位上的數從小到大和從大到小各排一次,為972和279,
相減得693。按上面做法再做一次,得到594,再做一次,得到495,之後反覆都得到495。
驗證4位數的黑洞數為6174。'''
def diff_str(n):
num2str = str(n)
num = list(num2str)
num.sort()
small = '';big = ''
for i in range(len(num)):
small = small + str(num[i])
big = big + str(num[len(num)-i-1])
diff = int(big) - int(small)
print "%d - %d = %d"%(int(big),int(small),diff)
if diff == 6174:
print "計算結束,6174是黑洞數"
else:
diff_str(diff)
diff_str(8260)
# 6. 求1000以內的勾股數。
import math
for i in range(1,1000):
for j in range(i+1,1000):
c = i**2 + j**2
if c > 1000:break
else:
print"1000以內勾股數為%d,%d,%d" %(i,j,c)
'''7.
如果某個數的平方的末尾幾位等於這個數,那麼就稱這個數為自守數。顯然,5和6是一位自守數
(5*5=25,6*6=36)。 25*25=625,76*76=5776,所以25和76是兩位自守數。求10000以內的自守數。'''
for i in range(1,100000):
len_i = len(str(i))
temp = list(str(i**2))
a = ''
for j in range(len(temp)-len_i,len(temp)):
a = a + str(temp[j])
if i == int(a):
print "%d 是自守數!"%i
else:continue
'''8.
所謂反序數,即有這樣成對的數,其特點是其中乙個數的數字排列順序完全顛倒過來,就變成另乙個
數,如102和201,36和63等,簡單的理解就是順序相反的兩個數,我們把這種成對的數互稱為反序數。
反序數唯一不可能出現以0結尾的數。乙個3位數各位上的數字都不相同,
它和它的反序數的乘積是280021,這個3位數應是多少?'''
for i in range(100,1000):
a = i/100
b = mod(i,100)/10
c = mod(i,10)
re_num = c*100 + b*10 + a
if re_num * i == 280021:
print "這個三位數是%d"%i
break
else:
continue
趣味百題之趣味猜想
coding utf 8 import sys reload sys sys.setdefaultencoding utf 8 created on wed dec 07 18 43 25 2016 趣味百題之趣味猜想 author onlyyo 1.角谷猜想的內容為 任意給定乙個自然數,若它為偶數...
3 2趣味整數之自守數
1.問題描述 2.問題分析 3.演算法設計 4.請給定數的長度 int numberofdigit long num return count 5.分離乙個定數最後的幾位 分離乙個定數 的最後k位 int lastnumber long objectnumber,int k return resul...
3 2趣味整數之自守數
1.問題描述 2.問題分析 3.演算法設計 4.請給定數的長度 int numberofdigit long num return count 5.分離乙個定數最後的幾位 分離乙個定數 的最後k位 int lastnumber long objectnumber,int k return resul...