一个数若刚好与小于它的所有因子之和相等,则称该数为一个"完数",如:6=1+2+3.求出10000以内的所有完数之和

令越Eo
2014-06-04 · TA获得超过402个赞
知道答主
回答量:108
采纳率:0%
帮助的人:72.2万
展开全部
我给楼主代码吧,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,这个数等于2147483647
*/
#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 64 127 254 508 1016 2032 4064
是否重新执行本程序?是请输入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
*/
雷厉风行o3
2014-06-03 · 超过19用户采纳过TA的回答
知道答主
回答量:161
采纳率:0%
帮助的人:50.7万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式