水仙花数、素数、完数、自守数专题

水仙花数

定义

水仙花数是指一个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;
}

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值