问题描述:
如果一个数等于它的因子之和,则称该数为“完全数”。例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完全数”。同时完全数也满 (2p-1)*2p-1这一公式,例如6的p=2。
请在第一行输出10000内的完全数,之后的行输出每个完全数对应的p,如:6 2
代码展示:
1 #include<stdio.h>
2 #include<math.h>
3 int fun1(int n[100][2]);
4 void fun2(int n[100][2], int len);
5 int main(){
6 int n[100][2]; //用于存储完全数及p
7 int i; //循环变量
8 int len; //完全数的个数
9 len = fun1(n); //求完全数
10 fun2(n,len); //求完全数的p值
11 printf("完全数有:");
12 for(i=0; i<len; i++){
13 printf("%d ", n[i][0]);
14 }
15 printf("\n每个完全数和对应的p值为:\n");
16 for(i=0; i<len; i++){
17 printf("%d %d\n",n[i][0],n[i][1]);
18 }
19 return 0;
20 }
21 int fun1(int n[100][2]){
22 int i,j;
23 int len=0;
24 int sum;
25 for(i=3;i<10000;i++){ //寻找完全数
26 sum = 0;
27 for(j=1; j<i; j++){
28 if((i%j)== 0){
29 sum = sum + j;
30 }
31 }
32 if(sum == i){
33 n[len][0] = i;
34 len++;
35 }
36 }
37 return len;
38 }
39 void fun2(int n[100][2], int len){ //求p值
40 int i,j,temp;
41 for(i=0; i<len; i++){
42 for(j=1; j<n[i][0]; j++){
43 temp = (pow(2,j)-1)*(pow(2,j-1));
44 if(temp == n[i][0]){
45 n[i][1] = j;
46 break;
47 }
48 }
49 }
50 }
运行截图: