水仙花数
定义
水仙花数是指一个n位正整数(n>=3),它的每个位上的数字的n次幂之和等于它本身。水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数。
例题加分析
判断一个三位数是否为水仙花数
常规方法 代码如下:
#include <stdio.h>
int main()
{
int x,a,b,c;
scanf("%d",&x);
a=x/100;
b=x/10%10;
c=x%10;
if(x>=100&&x<=999)
{if(x==a*a*a+b*b*b+c*c*c)
printf("Yes");
else
printf("No");}
else
printf("Invalid Value.\n");
return 0;
}
通用解法思路 代码如下:
#include <stdio.h>
int main()
{
int n,pi=0,x,m;//n为输入数,pi为累加和,
scanf("%d",&n);
m=n;//将n赋值给m,对n操作保留其原来的值
if(n>=100&&n<=999)
{
while(n!=0)
{
x=n%10;
pi=pi+x*x*x;
n=n/10;
}
if(m==pi)//判断累加和是否和原来的n的值相等
printf("Yes\n");
else
printf("No\n");
}
else
printf("Invalid Value.\n");
return 0;
}
水仙花数进阶:
判断所有水仙花数
例题如下:
代码如下:
#include <stdio.h>
int ppow(int x, int y);//自定义求n次方的函数(防止超时)
int fact(int x, int y);//自定义fact函数判断是否为水仙花数
int main()
{
int n, x, y;
scanf("%d", &n);
x = ppow(10, n - 1);//限定范围
y = x * 10;
for (int i = x; i < y; i++)//枚举
{
if (fact(i, n))//判断是否为水仙花数,是则直接打印出来
printf("%d\n", i);
}
return 0;
}
int ppow(int x, int y)
{
int i;
int sum = 1;
for (i = 1; i <= y; i++)
{
sum = sum * x;
}
return sum;
}
int fact(int x, int n)
{
int sum = 0, p, g;
p = x;
while (x != 0)
{
g = x % 10;
sum = sum + ppow(g, n);
x = x / 10;
}
if (p == sum)
return 1;
else return 0;
}
素数
定义
只能被1和自身整除的正整数,1不是素数,2是素数.
例题加分析
判断一个整数是否为素数
#include <stdio.h>
#include <math.h>
int main()
{
int i, limit, m;
scanf("%d", &m);
if (m <= 1)
{
printf("No\n");
}
else if (m == 2) {
printf("Yes\n");
}
else {
limit = sqrt(m) + 1;//缩小范围
for (i = 2; i <= limit; i++)
{
if (m % i == 0) {
break;
}
}
if (i > limit)
{
printf("Yes\n");
}else
{
printf("No\n");
}}
return 0;
}
进阶版:统计素数并求和
#include <stdio.h>
#include <math.h>//使用math库函数调用sqrt进行开平方操作
int sushu (int x);//自定义函数,来判断是否为素数
int main()
{
int m,n,pi=0,i,sum=0;
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++)
{
if(sushu(i)==1)//判断是素数就进行累加
{
pi=pi+i;
sum++;
}
}
printf("%d %d",sum,pi);
return 0;
}
int sushu (int x)//判断是否为素数
{
int limit,i;
if(x<=1)
return 0;
else if(x==2)
return 1;
else
{
limit=sqrt(x)+1;
for(i=2;i<=limit;i++)
{
if(x%i==0)
break;
}
if(i>limit)
return 1;
else return 0;
}
}
完数
定义
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。
例题分析
#include <stdio.h>
int main ()
{
int flag=0,i,j,m,n,s;
scanf("%d %d",&m,&n);
flag=0;//发挥着标记作用
for(i=m;i<=n;i++)
{
s=0;//每一次循环s都要回复初始值0,重新开始累加
for(j=1;j<=i/2;j++)//缩小判断范围
{
if(i%j==0)
{s=s+j;}
}
if(i==s)
{flag=1;//标记出现完数
printf("%d = 1",i);
for(j=2;j<=i/2;j++)
{if(i%j==0)
{
printf(" + %d",j);
}
}
printf("\n");
}
}
if(flag==0)
{
printf("None\n");
}
return 0;
}
自守数
定义
所谓自守数(也称守形数),是指其平方数的低位部分恰为该数本身的自然数。例如:252=625, 因此 25 是自守数。
例题分析:
判断自守数
代码如下:
#include <stdio.h>
int a(int x);//自定义函数判断是否为自守数
int main()
{
int n;
scanf("%d", &n);
if (a(n))
printf("yes\n");
else printf("No\n");
return 0;
}
int a(int x)
{
int p = x, q = x * x;
int ok = x >= 0;
while (ok && p)
{
ok = p % 10 == q % 10;//注意运算的优先级
p = p / 10;
q = q / 10;
}
return ok;
}