题目要求:
- 编写功能函数
(1)求n!
(2)求m的反序数。
(3)判断m是否是素数。
(4)判断m是否是完数,若是完数则输出其所有的因子。 - 输入两个正整数m、n,完成如下功能
(1)求出m和n两个数之间所有“明7暗7”数,即数字中有7或能整除7,如37,63.
(2)分别求出m! 和 n!
(3)求m和n的最大公约数和最小公倍数。
(4)求出m和n两个数之间的所有回文数。
(5)求出m和n两个数之间的所有素数。
(6)求出m和n两个数之间的所有完数。
#include<stdio.h>
int main()
{
double factorial(int n);
int PrimeNumber(int n);
int PerfectNumber(int n);
int ReversedNumber(int m);
int Gdivisor(int n,int m);
int m,n,t,i,a,flat1,flat2,sum,j,gys,gbs;
double N,M;
printf("输入两个整数n,m:");
scanf("%d,%d",&n,&m);
if(m>n) //保证m<n
{ t=m;m=n;n=t; }
//(1)求出m和n两个数之间所有“明7暗7”数(数字中有7或能整除7)
printf("m,n之间的“明7暗7”数:");
for(i=m;i<=n;i++)
{
t=i;
if(i%7==0)//暗7
printf("%5d",i);
else//明7
for(j=0;t!=0;++j)
{ if(t%10==7)
{ printf("%4d",i);break; }
t=t/10;
}
}
printf("\n\n");
//(2)分别求出m! 和 n!
printf("m,n的阶乘:\n");
N=factorial(n);
M=factorial(m);
printf("%d!=%e\n%d!=%e\n",n,N,m,M);
printf("\n");
//(3)求m和n的最大公约数和最小公倍数
gys=Gdivisor(n,m);
gbs=m*n/gys;
printf("最大公约数为%d\n",gys);
printf("最小公倍数为%d\n",gbs);
printf("\n");
//(4)求出m和n两个数之间的所有回文数
printf("m,n之间的回文数:");
sum=0;
for(i=m;i<=n;i++)
{
a=ReversedNumber(i);
if(a==i)
{ printf("%5d",a);
sum++; }
}
if(sum==0)
printf("无");
printf("\n\n");
//(5)求出m和n两个数之间的所有素数
printf("m,n之间的素数:");
sum=0;
for(i=m;i<=n;i++)
{
flat1=PrimeNumber(i);
if(flat1)
{ printf("%5d",i);
sum++; }
}
if(sum==0)
printf("无");
printf("\n\n");
//(6)求出m和n两个数之间的所有完数。
printf("m,n之间的完数:\n");
sum=0;
for(i=m;i<=n;i++)
{
flat2=PerfectNumber(i);
if(flat2)
{ sum++;
printf("%d是完数,因子为1",i);
for(j=2;j<i;j++)
if(i%j==0)
printf(",%d",j);
printf("\n");
}
}
if(sum==0)
printf("无");
printf("\n\n");
return 0;
}
//n的阶乘
double factorial(int n)
{
int i;
double s=1;
for(i=1;i<=n;i++)
s=i*s;
return s;
}
//反序数
int ReversedNumber(int m)
{
int a,i;
a=0;
while(m>0)
{
i=m%10;
a=a*10+i;
m=m/10;
}
return a;
}
//判断是否为素数
int PrimeNumber(int n)
{
int i;
for(i=n-1;i>1;i--)
{
if(n%i==0)
{ return 0; break; }
}
return 1;
}
//判断是否为完数
int PerfectNumber(int n)
{
int i,sum=0;
for(i=1;i<n;i++)
{
if(n%i==0)
sum=sum+i;
}
if(sum==n)
return 1;
return 0;
}
//求最大公约数(最小公倍数可由最大公约数和最小公倍数之间的关系求得)
int Gdivisor(int n,int m)
{
int i,gys;
for(i=m;i>0;i--)
if(n%i==0&&m%i==0)
{ gys=i;break; }
return gys;
}
输入的时候两数字之间用 “ ,” 隔开