趣味問題之趣味整數

2021-07-24 17:37:46 字數 4823 閱讀 1401

# -*- 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...