java抽象的算法0.1版本

前言:算法是考验一个人解决复杂问题的能力之一

0.1版本将使用运算符 + 流程控制基础内容完成

寻找水仙花数

打印九九乘法表

斐波那契数列

计算机中除法是不取小数点后的,运算符为 /

5/2=2

计算机中取模就是我们的取余,运算符为%

5%2=1

第一题:寻找水仙花数

复制代码
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。

现在甲方大大给了一个需求,寻找1000以内的水仙花数,并将文档说明和一个例子给了我们

1^3 + 5^3+ 3^3 = 153

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

ps:个人方法不一定试用任何人,请辩证看待

拿到一个需求后,我们第一步应该做什么?

肯定是TM的啊,不看怎么知道这个需求是什么。。。 看的时候快速过一遍,知道大概的内容

看完后,我知道了这个是讲 水仙花数的 。。。

(还在期待什么!没了...)

(还在期待什么!没了...)

(还在期待什么!没了...)

(选看)扩展:水仙花的启源

貌美青年那喀索斯(narcissus)爱上了自己在水中的倒影,他死后化作水仙花,此花

即因之命名。

看完后,就要了,观察词与词之间的逻辑联系,减去多余的描述

指一个 3 位数,每个位上的数字的 3次幂之和等于它本身

哦,原来,核心只有这两句话,可是还有好多字,再做一次减法,直击本质,将它浓缩成一句话

每位上的数字的 3次幂之和等于它本身,虽然不规范,但是这已经是最简单的理解了

*结合给的例子,*1^3 + 5^3+ 3^3 = 153

1的三次幂 = 1 * 1 * 1 = 1

5的三次幂 = 5 * 5 * 5 = 125

3的三次幂 = 3 * 3 * 3 = 27

1 + 125 + 27 = 153

java 复制代码
        int i = 1;
        if (1 * 1 * 1 == i)
        {
            System.out.println("是水仙花数!");
        }

计算器算出来的也是153

抽出最简单的理解进行分析:每位上的数字的 3次幂之和等于它本身 从简单到难

tips: 3次幂 a * a * a

最简单的例子:1的 3次幂 = 1,这个怎么用代码实现

简单判断一下,三个1的和是否等于1,代码如下。。。

java 复制代码
        int i = 1;
        if (1 * 1 * 1 == i)
        {
            System.out.println("是水仙花数!");
        }
        else System.out.println("不是水仙花数");

那么试着打印一下,个位数中的水仙花数

重复if(a * a * a = a)这句,我们是手写10次吗,当然不是,用流程控制中的循环去自动完成

循环的核心是起点,循环体,终点

起点就是开始的点,我们要的是个位数,起点应该是什么------0

重点就是结束的点,个位数,10算个位数吗,很显然不算------9

我们循环的内容是if(a * a * a = a)

现在难点是怎么让他们自动增加和退出循环,用自增符 ++

java 复制代码
        long l = System.nanoTime();//时间起点
        int s = 0;//起点
        int e = 9;//终点
        while (s <= e){
            if (s * s * s == s)
            {
                System.out.println(s + "是水仙花数");
            }
            s++;
        }
        long l1 = System.nanoTime();//时间终点
        System.out.println("程序运行时间:" + (l1 - l) + "纳秒");//时间过程

该程序的运行逻辑:分为两部分,第一部分计算代码的耗时,第二步部分计算各位数的水仙花数

在代码运行前,先打上一个标记,代码运行完后,再打上一个标记,两个标记之差就是运行时间,但是不一定准确,仅作参考

第二步部分的运行逻辑:变量进入while循环,当括号的内容为true(真)时,自动运行一次,花括号里的内容,s++,会在每次进入循环时,增加1,有没有看过回到过去的小说或者动漫,这就是无敌的迭代!当括号内的值变为false时,结束循环

这里我们可以知道一个程序一般情况的运行逻辑:从上到下(非特殊情况,无函数,无静态)


各位数可以完了,也能通过验证,0和1确实符号要求,现在两位数

两位数怎么获取单位数,最简单的方法,直接拆

怎么可能,两位数至少也有90个数,难不成写90个判断吗

很显然,不可能(也不算多,也就是90行而已)

核心问题就是怎么获取个位和十位数

现实中我们怎么将一个数分以10为单位的,个,十,百,千这个以10为单位

那么我们反过来,除以它就好了

例如,现在有一个80,我们名眼人就能看出来,十位是8,各位是0,怎么在80里取8呢,很简单,80除以10我们就取到8了,现在就是个位了,我们怎么取出0这个数,80除以什么等于个位上的0,

这里说到一个运算符,取模,举个例子,8%取模1=0,说简单点,就是取余的特殊版本

取模计算器 --- Calculator.iO这里有一个很棒的原理解释,想具体的可以看这个

这样我们就可以先通过除法获取十位的数字,在通过取模,获取各位的数

java 复制代码
        int i = 80;
        int shi = i / 10;//除法取十位
        int ge = i % 10;//取模取个位
        System.out.println("个位:" + ge + "," + "十位:" + shi);

        int x = 88;
        int shi1 = x / 10;//除法取十位
        int ge1 = x % 10;//取模取个位
        System.out.println("个位:" + ge1 + "," + "十位:" + shi1);

运行成功结果如下

精准拿到了十位和个位

用判断完成两位数的水仙花数

java 复制代码
        long l = System.nanoTime();//时间起点
        int i = 10;
        while (i < 100) {


            int shi = i / 10;
            int ge = i % 10;

            if (shi * shi * shi + ge * ge * ge == i)
            {
                System.out.println("水仙花数:" + i);
            }
            i++;
        }
        System.out.println("没有水仙花数");
        long l1 = System.nanoTime();//时间终点
        System.out.println("程序运行时间:" + (l1 - l) + "纳秒");//时间过程

两位数的没有水仙花数,三位数呢,试试了

现在我们可以通过取模+除法获取十位和个位,现在三位怎么做

怎么取百位,十位,个位

举个例子:这是一个三位数------986

先将它分为三部分:百位的9,十位的8,个位的6

这是一道减法题,减去其他没有用的数字

我们要拿到百位的9,就要减去无用的8和6

模仿我们两位和一位怎么取的,除以10

986除以10=98,98除以10=9,正好我们拿到了百位的9

这里我们发现我们除以10后获得的98可以通过取模,98%10=8,获取十位的8

现在还是一个位的6,直接986%10就可得到6

翻译成代码试试

java 复制代码
        int i = 986;
        int bai = 986 / 100;
        int shi = 986 / 10 % 10;
        int ge = 986 % 10;

        System.out.println("百位:" + bai + "," + "十位:" + shi + "," + "个位:" + ge);

正确了,加入循环,不要问为什么不用i,i只是习惯

java 复制代码
        for (int i = 100; i < 1000; i++) {

            int bai = i / 100;
            int shi = i /10 % 10;
            int ge = i % 10;
            
            if (bai * bai * bai + shi * shi * shi + ge * ge * ge == i) {
                System.out.println(i + "是水仙花数");
            }
        }

这次用for寻写

有了三位数,我们再试试4位数

拿:4986

在前两次中,发现一个规律,最高位只要一直除以10就能得到,看看对不对

4986/10=498,498/10=49,49/10=4,哟西,这个是对的

个位一直取模也是可以做到,4986%10 = 6

中间的就是除法搭配上取模混合得到

代码如下

java 复制代码
        int qian1 = 4986 / 1000;
        int bai1 = 4986 / 100 % 10;
        int shi1 = 4986 /10 % 10;
        int ge1 = 4986 % 10;

        System.out.println("千位:" + qian1 + "," + "百位:" + bai1 + "," + "十位:" + shi1 + "," + "个位:" + ge1);

        for (int i = 999; i < 10000; i++) {

            int qian = i / 1000;
            int bai = i / 100 % 10;
            int shi = i /10 % 10;
            int ge = i % 10;

            if (qian * qian * qian + bai * bai * bai + shi * shi * shi + ge * ge * ge == i) {
                System.out.println(i + "是水仙花数");
            }
        }
        System.out.println("4位数没有水仙花数");

计算机入门必备算法之一,水仙花数

接下来分析一下怎么解决这个问题的:

三个字,简单化,拆解化0.1版本

相关推荐
何曾参静谧3 分钟前
「QT」文件类 之 QTextStream 文本流类
开发语言·qt
monkey_meng7 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
手握风云-9 分钟前
零基础Java第十六期:抽象类接口(二)
数据结构·算法
落落落sss15 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
我救我自己15 分钟前
UE5运行时创建slate窗口
java·服务器·ue5
2401_8532757336 分钟前
ArrayList 源码分析
java·开发语言
zyx没烦恼36 分钟前
【STL】set,multiset,map,multimap的介绍以及使用
开发语言·c++
lb363636363636 分钟前
整数储存形式(c基础)
c语言·开发语言
feifeikon38 分钟前
Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
开发语言·python
爪哇学长40 分钟前
SQL 注入详解:原理、危害与防范措施
xml·java·数据库·sql·oracle