前言

我这里是Windows10/11专业工作版(其他Windows版本也适用)
如果你的设备是已经是结束支持的Windows7,请查阅其他相关是手册
这里演示的代码为c++代码


水仙花数

概念

水仙花数是指一个3位正整数,其每个位上的数字的3次幂之和等于它本身

问题1-判断是否是水仙花数

分析:满足条件每个位上的数字的3次幂之和等于它本身就是
1、输入你要判断的数字
2、求出每个位上的数字
3、判断
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<cmath>
int main(void){
int i ;
std::cin>>i; // 输入一个三位数
int a = i%10; //求个位
int b = i/10%10; // 求十位
int c = i /100; // 求百位
if (pow(a,3)+pow(b,3)+pow(c,3) == i ) // 用概念判断一下是否是三位数
std::cout<<"yes"; // 是就输出yes
else
std::cout<<"no"; // 不是就输出 no

return 0;
}

问题2-全部的水仙数

分析,在上面的基础山添加了一个信息是:全部即是要遍历一下全部的三位数,代码就变成了下面的结果了

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
#include<cmath>
int main(void){
for(int i =100;i<=999;i++){
int a = i%10; //求个位
int b = i/10%10; // 求十位
int c = i /100; // 求百位
if (pow(a,3)+pow(b,3)+pow(c,3) == i ) // 用概念判断一下是否是水仙花数
std::cout<<i<<" ";
}
return 0;
}

提升 - 水仙写法

判断是否是水仙花数

这里我们已经知道了位数是三位数,所以,我们就知道了位数是3,那么现在我们就是用水仙写法来解决问题吧!
思路分析:
我们可以将这个数的位数看作循环的次数,那么就知道的循环变量变化的等式是一个整除10的自运算,然后
在每次都涉及到了对数字的每一个位上的数进行3次幂操作,每个位上的数就是这个数和10取余数的结果,再将取好了的余数
进行3次幂操作,最后是用累加起来就达到想要的效果了,我们就得到了下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<cmath>
int main(void){
int i ;
std::cin>>i;
int temp = i,sum = 0;
while(temp){
sum+=pow(temp%10,3); // 计算每个位的三次的和
temp /= 10; // 去掉已经计算的位
}
if(sum == i) // 用概念判断一下是否是水仙花数
std::cout<<"yes"; // 是就输出yes
else
std::cout<<"no"; // 不是就输出 no
return 0;
}

全部的水仙花数

全部的水仙花数就可以写成下面的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<cmath>
int main(void){
for(int i =100;i<=999;i++){
int temp = i,sum = 0;
while(temp){
sum+=pow(temp%10,3); // 计算每个位的三次的和
temp /= 10; // 去掉已经计算的位
}
if(sum == i) // 用概念判断一下是否是水仙花数
std::cout<<i<<" ";
}

return 0;
}

拓展

计算数字的位数

得到了这思路我们就可以计算一个数字有多位,及是1个数字有多少个数字组成

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
int main(void){
int i ;
std::cin>>i;
int count= 0;
while( i ){
count++;
i/=10;
}
std::cout<<count;
return 0;
}

判断一个数字是否是回文数

设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。
例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
分析:
1、求出每个位数的数字
2、累和变量自乘10
3、累和变量加上美每一位上的数字
4、求出的和与原来的数字比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
int main(void){
int i ;
std::cin>>i;
int temp = i,sum = 0;
while( temp){
sum*=10; //扩大1位
sum += temp%10;
temp/=10;
}
if(sum == i ) // 用概念判断一下是否是回文数
std::cout<<"yes"; // 是就输出yes
else
std::cout<<"no"; // 不是就输出 no
return 0;
}

N位水仙花数

概念:指一个n位数,其各位数字的n次方之和确好等于该数本身
分析:
1、求这个数的位数
2、使用判断是否是水仙花数代码就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<cmath>
int main(void){
int i ;
std::cin>>i;
int temp = i,sum = 0,count=0;
// 求位
while( temp ){
count++;
temp/=10;
}
temp =i;
// 判断水仙花数
while(temp){
sum+=pow(temp%10,count); // 计算每个位的位数次的和
temp /= 10; // 去掉已经计算的位
}
if(sum == i) // 用概念判断一下是否是水仙花数
std::cout<<"yes"; // 是就输出yes
else
std::cout<<"no"; // 不是就输出 no
return 0;
}


总结

1、介绍水仙花数的概念
2、水仙花数在两大基本问题
3、水仙写法解决两大基本问题
4、水仙写法的拓展运用