目录
一、前言:
By: RuoChen404(Larry,另外一个名字)
CSDN: 钱塘江上潮信来,今日方知我是我
原创内容,转载须说明及网页地址
二、原理:
定义: 水花仙数:3 位数,它的每个数位上的数字的 3 次幂之和等于它本身。
例如:1^3 + 5^3+ 3^3 = 153。
火仙花数:是4位数,和水花仙数类似,它的每个数位上的数字的 4 次幂之和等于它本身。
在这里,我们暂时把3位、4位、5位......n位 统称为 水花仙数
那么,知道原理后,设计一次只求某位数(至少大于等于三位的),就很容易了。
——直接弄一层循环,在每一次循环内,把某位数各个进位的上的 值 单拎出来,再算其幂之和,如果等于某位数,那么,这个数(某位数)就是水仙花数。
以Python为例:
简单的三位水仙花数:
其中:a , b , c 设置为 int 类型,且值为 0 。
a = int(); b = int(); c = int()
for i in range(100,1000):
a = int(i/100)
b = int(i/10%10)
c = int(i%10)
if a*a*a + b*b*b + c*c*c == i:
print(i,"是水花仙数")
类似,四位水仙花数:
注意:Python中 / 和 // 是有区别的,一个精确到 double 类型(3 / 2 == 1.5),
一个精确到 int 类型(3 // 2 == 1)。
a = int(); b = int(); c = int();d = int()
for i in range(1000,10000):
a = i//1000
b = i//100%10
c = i//10%10
d = i%10
if a*a*a*a + b*b*b*b + c*c*c*c +d*d*d*d == i:
print(i,"是水花仙数")
不知道你有没有发现,位数加一,都要加一个变量,幂也要多算一次,这也太麻烦了吧?!
而且这是固定的,不能够通用。即,只能说明 某位数 的,不能解决其他位数的。
如果把每一位数的(大于等于三位)都重写一遍,那不累坏人?!
哎~我之前学算法时,就遇到类似的情况,正好可以解决:
while m > 0:
temp = int(m % 10)
sum += int(pow(temp,n))
m //= 10
m 临时储存 i 的值,temp作为临时变量,先存储个位的值,然后把 值 幂乘 后加给 sum ,
然后 m 舍弃原先个位,原来的十位 变 现在的个位,以此往复,每一进位的 值 都 幂乘 相加了,得到了 sum (即,sum = a^n + b^n + c^n……)
由此,我们可以简单写出这套程序的 雏形:
sum = int()
n = int(input())
min = int(pow(10, n - 1)) #开始数
max = int(pow(10, n)) #结束数
for i in range(min,max):
m = int(i)
while m > 0:
temp = int(m%10)
sum += int(pow(temp,n))
m //= 10
if sum == i:
print(i,"是水花仙数")
sum = 0 #不能少
注意!!!sum = 0 不能少,不重置 sum 为零,下一次循环,sum 的值将永远不会等于 i,
更不会打印 有哪些 水花仙数。
好了,如果你理解了以上内容,那么本教程,就完美结束了!!!
以下是优化后的代码:
三、C源码:
#include <stdio.h>
#include <math.h>
int main()
{
int number = 0, sum = 0;
printf("请输入一个整数n(n>2)来查找n位数的水仙花数:");
while (1) {
scanf_s("%d", &number);
if (number < 3) printf("\n输入不合理,最小位数应大于2:\n请重新输入:\n");
else break;
}
int min = pow(10, number - 1);//开始数
int max = pow(10, number);//结束数
printf("\n%d位数的水仙花数有:\n", number);
for (int i = min; i < max; i++) {
int m = i;
while (m > 0) {
int temp = m % 10;//临时储存
sum += pow(temp, number);//幂之和
m /= 10;//倒着存储进位上的数
}
if (sum == i)printf("%d\t", i);//判断是否为水仙花数
sum = 0;//sum归零,不然会一直算下去,得不到正确答案
}
printf("\n");
return 0;
}
四、C++源码:
#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
int main()
{
int number = 0, sum = 0;
cout << "请输入一个整数n(n>2)来查找n位数的水仙花数:";
while (1) {
cin >> number;
if (number < 3)cout << "\n输入不合理,最小位数应大于2:\n请重新输入:\n";
else break;
}
int min = pow(10, number - 1);//开始数
int max = pow(10, number);//结束数
cout << '\n' << number << "位数的水仙花数有:" << '\n';
for (int i = min; i < max; i++) {
int m = i ;
while (m > 0) {
int temp = m % 10;//临时储存
sum += pow(temp, number);//幂之和
m /= 10;//倒着存储进位上的数
}
if(sum==i)cout << i<<'\t';//判断是否为水仙花数
sum = 0;//sum归零,不然会一直算下去,得不到正确答案
}
cout << '\n';
return 0;
}
五、JAVA源码:
import java.util.*;
public class hello{
public static void main(String[] args) {
int number = 0, sum = 0;
System.out.print("请输入一个整数n(n>2)来查找n位数的水仙花数: ");
try (Scanner s = new Scanner(System.in)) {
while (true) {
number = s.nextInt();
if (number < 3) System.out.print("\n输入不合理, 最小位数应大于2\n请重新输入: \n");
else break;
}
}
int min = (int) Math.pow(10, number - 1);//开始数
int max = (int) Math.pow(10, number);//结束数
System.out.print("\n"+number+"位数的水仙花数有:\n");
for (int i = min; i < max; i++) {
int m = i;
while (m > 0) {
int temp = m % 10;//临时储存
sum += (int) Math.pow(temp, number);//幂之和
m /= 10;//倒着存储进位上的数
}
if (sum == i)System.out.print(i+" ");//判断是否为水仙花数
sum = 0;//sum归零,不然会一直算下去,得不到正确答案
}
System.out.print('\n');
}
}
六、Python源码:
sum = int()
print("请输入一个整数n(n>2)来查找n位数的水仙花数:")
while True :
number = int(input())
if (number < 3 ): print("\n输入不合理,最小位数应大于2:\n请重新输入:\n")
else: break
min = int(pow(10, number - 1))#开始数
max = int(pow(10, number))#结束数
print("位数的水仙花数有:\n")
for i in range(min,max):
m = int(i)
while m > 0 :
temp = int(m % 10)#临时储存
sum += int(pow(temp, number))#幂之和
m //= 10#倒着存储进位上的数
if sum == i: print(i)#判断是否为水仙花数
sum = 0#sum归零,不然会一直算下去,得不到正确答案
print("\n")
七、趣事闲聊:
评论区聊(不想改文章了!!!)