一个数若刚好与小于它的所有因子之和相等,则称该数为一个"完数",如:6...

发布网友 发布时间:5小时前

我来回答

2个回答

热心网友 时间:5分钟前

我给楼主代码吧,C语言的!
/*
2014年6月4日19:22:35
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如,6的因子为1,2,3,而6 = 1 + 2 + 3,因此6是“完数”。
编程序找出1000之内所有的完数,并按下面格式输出其因子;
6 its factors are 1, 2, 3
注:根据补码的知识,int类型占4个字节,它所能表示的最大正整数为2的31次方减1,这个数等于21474837
*/
#include <stdio.h>
#include <malloc.h>
void Input_1(int *, int *, bool *);
void Deal_1(int *, int *, int *);
void Deal_2(int *, int *);
void Deal_3(int *, int *, int *);
void Deal_4(int *, int *, int *);
void Output_1(int *, int *, bool *);
int main(void)
{
bool flag_1 = 1, flag_2 = 1;
while(flag_1)
{
int a, b, cont_1 =0;

Input_1(&a, &b, &flag_2);

Deal_1(&a, &b, &cont_1);

int * u = (int *)malloc(cont_1 * sizeof(int));

Deal_3(&a, &b, u);

Output_1(&cont_1, u, &flag_1);
}

return 0;
}
void Input_1(int * p, int * q, bool * r)
{
bool flag_1 = 1, flag_2 = 1;
while(*r)
{
printf("请按照提示输入要进行完数查找的起始数字和截止数字!\n");
*r= 0;
}
while(flag_1)
{
printf("请输入进行完数查找的起始数字(大于零的正整数):");
scanf("%d", p);
while(getchar() != '\n')
{
continue;
}
if(*p <1)
{
printf("您输入的数字有误,请按照提示重新输入!\n");
}
else
{
flag_1 = 0;
}
}
while(flag_2)
{
printf("请输入进行完数查找的截止数字(大于等于起始数字正整数):");
scanf("%d", q);
while(getchar() != '\n')
{
continue;
}
if(*q < *p )
{
printf("您输入的截止数字有误,请按照提示重新输入!\n");
}
else
{
flag_2 = 0;
}
}
return;
}
void Deal_1(int * p, int * q, int * s)
{
int i;
for(i=*p;i<=*q;i++)
{
Deal_2(&i, s);
}
}
void Deal_2(int * t, int * s)
{
int j, int sum = 0;
for(j=1;j<*t;j++)
{
if(*t % j == 0)
{
sum = sum + j;
}
}
if(*t == sum)
{
(*s)++;
}
}
void Deal_3(int * p, int * q, int * u)
{
int i, k = 0;
for(i=*p;i<=*q;i++)
{
Deal_4(&i, u, &k);
}
}
void Deal_4(int * t, int * u, int * v)
{
int j, int sum = 0;
for(j=1;j<*t;j++)
{
if(*t % j == 0)
{
sum = sum + j;
}
}
if(*t == sum)
{
*(u+ *v) = *t;
(*v)++;
}
}
void Output_1(int * s, int * u, bool * w)
{
char ch;
int i,j;
if(*s == 0)
{
printf("\n没有符合条件的数字!\n");
}
else
{
printf("\n符合条件的完数共有%d个,它(们)是:\n", *s) ;
for(i=0;i<*s;i++)
{
printf("%d,因子有:\n",*(u+i));
for(j=1;j<*(u+i);j++)
{
if(*(u+i)% j == 0)
printf("%-5d",j);
}
printf("\n");
}
}
printf("是否重新执行本程序?是请输入Y(y),否则退出程序:");
ch = getchar();
while(getchar() != '\n')
{
continue;
}
if(ch == 'Y' || ch == 'y')
{
printf("\n");
}
else
{
*w = 0;
}
}
/*
在VC++6.0中输出结果为:
请按照提示输入要进行完数查找的起始数字和截止数字!
请输入进行完数查找的起始数字(大于零的正整数):1
请输入进行完数查找的截止数字(大于等于起始数字正整数):10000
符合条件的完数共有4个,它(们)是:
6,因子有:
1 2 3
28,因子有:
1 2 4 7 14
496,因子有:
1 2 4 8 16 31 62 124 248
8128,因子有:
1 2 4 8 16 32 127 254 508 1016 2032 40
是否重新执行本程序?是请输入Y(y),否则退出程序:Y
请输入进行完数查找的起始数字(大于零的正整数):1
请输入进行完数查找的截止数字(大于等于起始数字正整数):1000
符合条件的完数共有3个,它(们)是:
6,因子有:
1 2 3
28,因子有:
1 2 4 7 14
496,因子有:
1 2 4 8 16 31 62 124 248
是否重新执行本程序?是请输入Y(y),否则退出程序:N
*/

热心网友 时间:9分钟前

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com