c语言菜鸟求救!!题目为输入正整数n,算出0~n内的完全数,亲密数,水仙花,数阶乘和数,自守数孪生素数,黑洞数等

请编写程序,输入正整数n,1<n<50000, 输出小于n的所有
1.完全数、
2.亲密数、
3.水仙花数、
4.阶乘和数、
5.自守数、
6.孪生素数,
7.黑洞数。丶

1.完全数是恰好等于自身的因子之和的数,X如6是,因为6=1*2*3=1+2+3;

2.亲密数是两个正整数,每个全部因子之和等于对方(因子中只不计本身),X如220和284是, 因为220的全部因子是1,2,4,5,10,11,20,22,44,55,110,和为284,而284的全部因子是1,2,4,71,142,和为220;

3.水仙花数是恰好等于自身各位数字立方和的数,X如153是,因为153=13+53+33;

4.阶乘和数是恰好等于自身各位数字阶乘的和的数,X如145是,因为145 = 1!+4!+5!;

5.自守数是平方后尾部数字是自身的数,X如9376是,因为93762=87909376;

6.孪生素数是差2的两个素数,X如197和199。

7.黑洞数又称陷阱数,是经有限次“重排求差”操作达到的不再改变的数,“重排求差”操作是将组成一个数的各位数字重排得到的最大数减去最小数,例如207,“重排求差”操作序列是:702-027=693,963-369=594,954-459=459,再做下去不变了。再用208算一次,也停止到495,所以495是三位黑洞数

大虾们救命啊,不会做,做不出来就不能毕业啊,谢谢了!!!

还差黑洞数。。。。。。

#include "stdio.h"
#include "math.h"
int fun(int n)
{//求n的所有因数和
int sum=1,i;
for(i=2;i<n;i++)if(n%i==0)sum=sum+i;
return sum;
}
int jiecheng(int n)
{//求n的阶乘
int num=1,i;
for (i=2;i<=n;i++)num*=i;
return num;
}
int Prime(int n)
{//判断n是否是素数
int i=3;
while(i<=sqrt(n))if(n%i++==0)return 0;
return 1;
}
void wanquanshu(int n)
{//完全数
int i,count=0;
printf("完全数:\n");
for(i=0;i<=n;i++)
{
if(i==fun(i))
{
printf("%-5d ",i);
if(++count%5==0)printf("\n");
}
}
if (count%5!=0) printf("\n");
}
void qinmishu(int n)
{//亲密数
int i,temp,count=0;
printf("亲密数:\n");
for (i=0;i<=n;i++)
{
temp=fun(i);
if (temp>i&&i==fun(temp))
{
printf("(%d,%d) ",i,temp);
if (++count%5==0)printf("\n");
}
}
if (count%5!=0) printf("\n");
}
void shuixianhua(int n)
{//水仙花数
int i,m=3,sum,count=0,temp;
printf("水仙花数:\n");
for(i=100;i<=n;i++)
{
if(999<i&&i<10000)m=4;
if(9999<i&&i<100000)m=5;
temp=i;
sum=0;
while (temp)
{
sum+=(int)pow(temp%10,m);
temp/=10;
}
if (sum==i)
{
printf("%-5d ",i);
if(++count%5==0)printf("\n");
}
}
if (count%5!=0) printf("\n");
}
void jiechengheshu(int n)
{//阶乘和数
int i,count=0,temp,sum;
printf("阶乘和数:\n");
for(i=0;i<=n;i++)
{
sum=0;
if (i==0)sum=jiecheng(i);
else
{
temp=i;
while(temp)
{
sum+=jiecheng(temp%10);
temp/=10;
}
}
if (sum==i)
{
printf("%-5d ",i);
if(++count%5==0)printf("\n");
}
}
if (count%5!=0) printf("\n");
}
void zishoushu(int n)
{//自守数
int i,count=0,temp,t;
long num;
printf("自守数:\n");
for(i=0;i<=n;i++)
{
num=i*i;
t=10;
temp=i/10;
while(temp)
{
t*=10;
temp/=10;
}
if (num%t==i)
{
printf("%-5d ",i);
if(++count%5==0)printf("\n");
}
}
if (count%5!=0) printf("\n");
}
void luanshengsushu(int n)
{//孪生素数
int i,count=0;
printf("孪生素数:\n");
for(i=3;i<=n-2;i+=2)
{
if (Prime(i)&&Prime(i+2))
{
printf("(%d,%d) ",i,i+2);
if (++count%5==0)printf("\n");
}
}
if (count%5!=0) printf("\n");
}
int main()
{
int n;
printf("输入n:");
scanf("%d",&n);
wanquanshu(n);
qinmishu(n);
shuixianhua(n);
jiechengheshu(n);
zishoushu(n);
luanshengsushu(n);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-29
#include <stdio.h>
#include <math.h>

void wanquanshu();
int max;

void main()
{
printf("input a num:\n");
scanf("%d",&max);
wanquanshu();

}

void wanquanshu()
{
int sum = 1;//1是所有整数的因子
int i,j,temp;
printf("完全数:\n");
for(i = 1; i <= max; i++)
{
temp = i;
for( j = 2; j <= i/2; j++ )
{
if(temp % j == 0)
{
temp /= j;
sum += j;
j = 2;
}
}
if(sum == i)
printf("%d\n",i);
sum = 1;
}
}
这个东西很费时间的,我刚写了一个完全数的,给你参考一下,其他的处理方式是一样的,慢慢写吧,祝你成功
相似回答