完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
数据范围:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
输入一个数字n
输出不超过n的完全数的个数
1000
3
def is_perfectNum(num): L = [] for i in range(1,num): if num % i == 0: L.append(i) if sum(L) == num: return True return False while True: try: n = int(input().strip()) if 0 < n <= 500000: count_perfectNum = 0 for i in range(1, n+1): if is_perfectNum(i): count_perfectNum += 1 print(count_perfectNum) except: break
def checkprime(num): if num == 1: return False list1 = [] for i in range(2, num): if num % i == 0: list1.append(i) if not list1: return True else: return False while True: try: n = int(input()) res = [] for i in range(1, n+1): if (2**i-1)*2**(i-1) > n: break elif checkprime(i) and checkprime(2**i-1): res.append((2**i-1)*2**(i-1)) print(len(res)) except: break
# Python3单纯的遍历解法,算法过程清晰明了,运行时间850ms~900ms # 判断一个数是否为完全数 def perfect_number(num): add = 0 # 遍历寻找真因子约数 for i in range(1, num): if num % i == 0: add += i # 所有真因子约数之和已经大于这个数本身 if add > num: break if add == num: return True else: return False while True: try: n = int(input()) cnt = 0 # 遍历寻找完全数 for i in range(1,n+1): if perfect_number(i): cnt += 1 print(cnt) except: break
def primeList(n:int): # 欧拉筛素数 时间复杂度 o(n) num = [True for i in range(n + 1)] prime = [] for i in range(2, n + 1): if num[i]: prime.append(i) for j in prime: if i * j > n: break num[i * j] = False if i % j == 0: break return prime, num while True: try: n = int(input().strip()) res = 0 prime, num = primeList(n) for i in prime: tmp = 2 ** i - 1 if tmp > n: break if num[tmp]: # 欧拉公式 判断完全数 perfect_num = tmp * (2 ** (i - 1)) if perfect_num > n: break res += 1 print(res) except: break
#用例用了1.3s,3M内存。勉强通过,但是底下试试50000,几十秒了,4各完美数 #50000 #[6, 28, 496, 8128] while True: try: number = int(input()) perfectNum = [] for num in range(6, number + 1): factor = [] sumCount = 0 # print(num) for i in range((num+1)//2): if num % (i+1) == 0: factor.append(i + 1) # print('factor: ', factor) for i in factor: sumCount += i # print('sumCount: ', sumCount) if sumCount == num: perfectNum.append(num) print(perfectNum) print(len(perfectNum)) except EOFError: break
# 人们知道完全数有什么用呢? # 6=2×3=2×(2^2-1) # 28=4×7=2^2×(2^3-1) # 496=16×31=2^4×(2^5-1) # 8128=64×127=2^6×(2^7-1) # 寻找其他解法 # 利用欧拉的公式:如果i是质数,2^i-1也是质数,那么(2^i-1)*2^(i-1)就是完全数 import sys def checkprime(num): if num ==1 : return False lis1 = [] for i in range(2, num): if num%2 == 0: lis1.append(i) if not lis1: return True else: return False if __name__ == '__main__': for line in sys.stdin: n = int(line) res = [] for i in range(1,n+1): if (2**i-1)*2**(i-1)>n: break elif checkprime(i) and checkprime(2**i-1): res.append((2**i-1)*2**(i-1)) print(len(res)) # 完全数 # 循环遍历 每个数从1到它本身整除,整除的数放进set()集合,去除重复元素 并求除它自身以外的和 # 单纯遍历会引起超时 ''' yueshu = [] yueshu.append(1) # 任何自然数都能被1整除 k = 0 # 完全数结果 for i in range(3, n): yueshu = [1] for j in range(2, i): if i % j == 0: yueshu.append(j) yueshu.append(i/j) else: continue if sum(set(yueshu)) == i: k = k + 1 print(i) print(k) '''
while True: try: n = int(input()) res = 0 for i in range(1, n): sum_num = 0 for j in range(1, i//2 + 1): if i%j == 0: sum_num += j if sum_num == i: res += 1 print(res) except: break