(免费)秒解水仙花数(附带详细教程,包学会。多位数n>=3水仙花数,C/C++,JAVA,Python极简源码)

目录

一、前言:

二、原理:

三、C源码:

四、C++源码:

五、JAVA源码:

六、Python源码:

七、趣事闲聊:



一、前言:

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")

七、趣事闲聊:

评论区聊(不想改文章了!!!)

  • 38
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值