首页 > 其他分享 >求0~100000的“水仙花数”

求0~100000的“水仙花数”

时间:2024-01-22 21:01:10浏览次数:29  
标签:10 digit int sum num 100000 水仙花

求0~100000的“水仙花数”。

严格来说,三位自幂数才称为水仙花数。

但我们这里对其进行了变种,定义“水仙花数”为:一个n位数的每位的n次方相加,刚好等于它本身的数。

如:153 == 1^3 + 5^3 + 3^3


分析

这个题目的关键在于:

  1. 如何知道这个数是几位数?
  2. 如何判断这个数是否为“水仙花数”?

我们分成2个函数来解决:

  1. 如何知道这个数是几位数?
  1. 我们不断地进行n /= 10,当n == 0时,根据循环的次数,我们就可以得到n的位数。
  1. 如何判断这个数是否为“水仙花数”?
  1. 取极右法
  1. 让n % 10,即可得到它的个位(极右)
  2. 让n / 10,则可以让n使其它的个位
  3. 然后让新的n再进入一次循环,最后就能得到它的每一位
  4. 把每一位^位数的和与n相比,相等则为水仙花,代码如下
//取极右法
bool Is_lily_number(int n, int digit)
{
	int i = 0;
	int num = 0;
	int sum = 0;
	int same_n = n;

	for (i = 0; i < digit; i++)
	{
		//取出n的个位数
		num = pow(n % 10, digit);

		//去除n的个位数
		n /= 10;

		sum += num;
	}
	if (sum == same_n)
	{
		return true;
	}
	else
	{
		return false;
	}
}
  1. 取极左法
  1. 下图代码中使用的是这种方法,里面有详细注释。
整个代码如下
#include <stdio.h>
#include <stdbool.h>
#include <math.h>

int Count_digits(int n)
{
	int count = 0;

	while (n != 0)
	{
		n /= 10;
		count++;
	}
	return count;
}

bool Is_lily_number(int n, int digit)
{
	int i = 0;
	int sum = 0;
	int num = 0;
	int same_n = n;

	//求出每一位数,然后让每一位数的指数为digit(位数)
	for (i = 0; i < digit; i++)
	{
		//以数字“123”举例:
		//想取123的最左一位
		//则让123 /(10^(3-1))即可
		//所以我们这里设置为digit - i - 1
		num = n / pow(10, digit - i - 1);

		// 123的1已经取走,现在让23继续继续下一轮循环
		n %= (int)pow(10, digit - i - 1);

		//把每一位处理好的数相加
		sum += pow(num,digit);
	}
	if (sum == same_n)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	int i = 0;
	int digit = 0;
	int count = 0;

	for (i = 1; i <= 100000; i++)
	{
		digit = Count_digits(i);
		if (Is_lily_number(i, digit))
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n0~100000中,共有%d个水仙花数\n", count);

	return 0;
}


标签:10,digit,int,sum,num,100000,水仙花
From: https://blog.51cto.com/u_16509575/9370092

相关文章

  • C练习——水仙花数
     “水仙花数”是指一个三位数,其每位数字的立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。//打印100-999的所有水仙花数//利用for循环控制100-999个数,每个数分解出个位,十位,百位,再分别求立方相加并判断即可。#include<stdio......
  • 求n位的水仙花数
    #include<stdio.h>#include<math.h>intmain(){ intn,i,j; scanf_s("%d",&n); i=(int)pow(10.0,n-1);\\n位数的开始,如n为3则i为100j=(int)pow(10.0,n)-1;\\n位数的结束,如n为3则j为999 intsum=0; for(i;i<=j;i++)\\对n位数的每一个数进行判断是否为水......
  • SpringBoot模拟插入1000000万条数据
    一、数据库表准备CREATETABLE`student`(`id`bigintNOTNULLCOMMENT'用户id',`name`varchar(50)COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT'姓名',`address`varchar(250)COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT'地址'......
  • 水仙花数
    #include<stdio.h>#include<math.h>intmain(){ inta,b,c,n1; for(a=1;a<=9;a++) for(b=0;b<=9;b++) for(c=0;c<=9;c++) { n1=a*100+b*10+c; if(n1==pow(a,3)+pow(b,3)+pow(c,3)) p......
  • 判断一个数是否是水仙花数
    #include<stdio.h>intmain(){intm,a,b,c,d;scanf_s("%d",&m);a=(int)(m/100);b=(int)((m-a100)/10);c=(int)(m-100a-10b);d=(a*aa)+(b*bb)+(c*cc);//printf("%d%d%d%d%d",m,a,b,c,d);if(m==d){......
  • 水仙花数
    水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。本题要求编写程序,计算所有N位水仙花数。输入格式:输入在一行中给出一个正整数N(3≤N≤7)。输出格式:按递增顺序输出所有N位水仙花数,每个数字占一行。输入样例:3输出样例:153......
  • 水仙花数的打印(仅个人探索)
             详解在代码中已标示,数据范围可更改            //自己摸索的水仙花数(φ(◎ロ◎;)φ)#include<tgmath.h>#include<math.h>intmain(){ intsum=0; inti=0;//floor为向下取整符号,对数函数算出的指数即位数减一 头......
  • 7-2 水仙花数
    目录目录目录题目思路代码第一次未通过所有测试点评测详情分析原因第二次通过所有测试点测试详情题后小知识题目水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如153=1^3+5^3+3^3。本题要求编写程序,计算所有N位水仙花数。输入格式:输入在一行......
  • 送你一朵【水仙花数】
    文章目录前言一、题目二、思路分析:二、代码分析总结前言水仙花性喜温暖、湿润、排水良好的环境。在中国已有一千多年栽培历史,为传统观赏花卉。水仙花数(Narcissisticnumber)也被称为超完全数字不变数(pluperfectdigitalinvariant,PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗......
  • C语言-水仙花数
    计算100-1000内的水仙花#include<stdio.h>//水仙花数boolshuixianhua(intnum); intmain(){ inti; for(i=100;i<1000;i++){ if(shuixianhua(i)==1){ printf("%disashuixianhuanum.\n",i); } } return0; }boolshuixianhua(in......