1. 請編寫程序,輸入正整數n,1<n<50000, 輸出小於n的所有 1.完全數、 2.親密數、 3.水仙花數、 4.階乘和數、 5
請編寫程序,輸入正整數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;
}