完美数和亲和数计算之Python和C

买了套书,是给大儿子看的:《万物有数学》看上去大儿子还是满意的。里面讲了完美数、亲和数、缺八数等等。在亲和数和完美数领域,都是和因数有关系的,所以一时手痒,顺便把计算机是怎么求的方法讲了一遍。动手用python和c都实现了一把:

先上C的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <time.h>
int getYSList(int number){
int returnValue = 1;
int i=2;
while(i
if(number % i == 0){
returnValue += i;
}
i++;
}
return returnValue;
}
int main(){
int number, sumOfys, i, sumOfsum, j;
clock_t start, finish;
printf("Please input the number:");
scanf("%d", &number);
start=clock();
j = 0;
for(i=2;i
sumOfys = getYSList(i);
if(sumOfys>i){
sumOfsum = getYSList(sumOfys);
if(sumOfsum == i){
j++;
printf("Find the [ - ]对 亲和数: m 和 m\n", j, i, sumOfys);
}
}
}
finish=clock();
printf("亲和数计算时间: \t %f\n", (double)(finish-start)/CLOCKS_PER_SEC);
start=clock();
j = 0;
for(i=2;i
if(getYSList(i) == i){
j++;
printf("Find the [ %d ]个完美数: %d\n", j, i);
}
}
finish=clock();
printf("完美数计算时间: \t %f\n", (double)(finish-start)/CLOCKS_PER_SEC);
return 0;
}

再上python的版本,做了2种,单进程和多进程的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/bin/env python3
## -*-coding: utf-8 -*-
from colorama import Fore, init
from time import time
from multiprocessing import Pool
import multiprocessing
# 设置查找亲和数的范围
AX_NUMBER = 2000
# 得到因数列表
# 输入:number 需要计算其因数的数字
# 输出:retList 不包括其自身的因数列表
def getYSList(number):
retList = [1]
i = 2
while i < number:
if number % i == 0:
retList.append(i)
i += 1
# print(retList)
return retList
# 计算因数之和
def calSumOfYS(number):
returnValue = 1
i = 2
while i if number % i == 0:
returnValue += i
i += 1
return returnValue
# 求亲和数方法II
def calQinhe2(number_start, number_scope):
j = 0
for number in range(number_start, number_scope):
sumNumberYS = calSumOfYS(number)
if sumNumberYS <= number:
continue
if number == calSumOfYS(sumNumberYS):
j += 1
print("找到第",
Fore.BLUE + "[-]" % j,
"对亲和数:",
Fore.RED + "m" % number ,
" 和 ",
Fore.RED + "m" % sumNumberYS)
# 计算亲和数多线程
def calQinheM(number):
sumNumberYS = calSumOfYS(number)
if sumNumberYS > number:
if number == calSumOfYS(sumNumberYS):
print("找到亲和数:",
Fore.RED + "m" % number ,
" 和 ",
Fore.RED + "m" % sumNumberYS)
#计算完美数II
def calWanmei2(number_start, number_scope):
j = 0
for number in range(number_start, number_scope):
if calSumOfYS(number) == number:
j += 1
print("找到第",
Fore.CYAN + "[-]" % j,
"个完美数:",
Fore.RED + "m" % number)
# 计算完美数多线程
def calWanmeiM(number):
if calSumOfYS(number) == number:
print("找到完美数:",Fore.RED + "m" % number)
if __name__ == '__main__':
# 找亲和数
init(autoreset=True)
number_scope = int(input("请输入计算范围: " ) or MAX_NUMBER)
pool = Pool(multiprocessing.cpu_count())
print(Fore.BLUE + ("#"*10 + "找亲和数" + "#"*10))
beginT = time()
calQinhe2(2, number_scope)
endT = time()
print("calQinhe2 用了 %.5f 秒" % (endT-beginT))
beginT = time()
pool.map(calQinheM, [i for i in range(2, number_scope)])
endT = time()
print("calQinheM 用了 %.5f 秒" % (endT-beginT))
# 找完美数
print("\n\n\n")
beginT = time()
calWanmei2(2, number_scope)
endT = time()
print("calWanmei2 用了 %.5f 秒" % (endT-beginT))
beginT = time()
params = [ i for i in range(2, number_scope)]
#calWanmei2(2, number_scope)
pool.map(calWanmeiM, params)
endT = time()
print("calWanmeiM 用了 %.5f 秒" % (endT-beginT))

嗯,下面重点来了,都求在【20,000】以内的值:效率差太多了
python的执行效率:
Python求亲和数和完美数
C的执行效率:
C求亲和数和完美数
以上。