20175320我的项目-趣味天然数

我的项目-趣味天然数

1、需求分析

根据题目要求,咱们须要了解如下几种特殊的天然数:java

(一)水仙花数

水仙花数也被称为超彻底数字不变数。若是一个数是一个 3 位数,且它的每一个位上的数字的 3次幂之和等于它自己,那么这个数就是一个水仙花数。c++

(二)彻底数

若是一个数刚好等于它的因子之和(数字自身除外),则称该数为彻底数。git

(三)回文数

设n是一任意天然数。若将n的各位数字反向排列所得天然数n1与n相等,则称n为一回文数。编程

(三)尼科彻斯定理

任何一个整数的立方均可以写成一串相邻奇数之和(由于若是不是一串相邻的奇数,这个奇数组合可能会有多个),这就是尼科彻斯定理。数组

(五)亲密数

若是a的全部正因子和等于b,b的全部正因子和等于a,因子包括1但不包括自己,且a不等于b,则称a,b为亲密数对。测试

(六)勾股数

勾股数就是能够构成一个直角三角形三边的一组正整数。勾股定理:直角三角形两条直角边a、b的平方和等于斜边c的平方(a²+b²=c²)。设计

(七)四方定理

四方定理是数论中著名的一个定理,指全部天然数至多只要用四个数的平方和就能够表示。3d

2、功能设计

因为这些数据只能经过其特征来判断或者生成,没法像Integer等数据编写具体的类来表示这一类数据,因此我经过编写不一样的程序在必定的范围内寻找或判断输入的数据是否为这7种类型的数中的某种特定的数。code

3、设计实现

(一)水仙花数

直接对全部三位数进行遍历,将三位数的个、10、百位分解出来,并在对每一个数求三次幂后进行相加,最后判断相加的结果是否为原来的三位数,若是是的话则该数为水仙花数。相关代码以下blog

public class Narcissistic {
    public static void main(String[] args) {
        int num,hun,ten,one;
        for(num=100;num<999;num++){//遍历全部三位数
            hun=num/100;//分解三位数
            ten=(num%100)/10;
            one=(num%100)%10;
            if(hun*hun*hun+ten*ten*ten+one*one*one==num){//判断三次幂的和是否等于原数
                System.out.println("有水仙花数:"+ num);
            }
        }
    }
}

(二)彻底数

在这里我编程寻找10000之内的彻底数。对100000之内的数字n进行遍历,再经过第二个遍历找到能将n整除的小于n的数,并求出这些数的和,若它们的和等于n,则该数为彻底数。具体代码以下:

public class PerfectNumber {
    public static void main(String[] args) {
        int num;
        System.out.println("计算100000之内的彻底数");
        for(num=1;num<=100000;num++){//遍历100000之内的数
            int temp=0;
            for(int i=1;i<num;i++){//寻找当前判断的数的因子
                if(num%i==0){
                    temp=temp+i;//对因子求和
                }
            }
            if(temp==num){
                System.out.println("有彻底数为:"+num);//输出找到的彻底数
            }
        }

    }
}

(三)回文数

在这里我编程寻找1000之内的回文数,对1000之内的数字n进行遍历,并将数字中的每一位存放到数组中,并对数组的前半部分进行遍历,并将前半部分的值与对称位置的后半部分的值进行比较,若是全部前半部份数据的值都与其对应数相等,则该数为一个回文数。代码以下:

public class Palindromic {
    public static void main(String[] args) {
        System.out.println("1000之内的回文数为:");
        int num,find=0;
        String tem;
        char step[];
        for (num=1;num<1000;num++){
            find=0;
           tem=String.valueOf(num);
           step=tem.toCharArray();
           for(int i=0;i<step.length/2;i++){//访问前半部份
               int j=step.length-i-1;
               if(step[i]!=step[j]){
                   find=1;//若是对应位置的数据不相同时标记出来
               }
           }
            if(find==0){//没有不相同的状况下判断该数为回文数
                System.out.println("有回文数为:"+num);
            }
        }
    }
}

(三)尼科彻斯定理

尼科彻斯定理是一个数的三次幂能够分为几个连续奇数的和,所以在这里我编程判断输入的数据可分解为哪几个数连续的奇数。代码以下:

import java.util.Scanner;

public class Nicocheus {
    public static void main(String[] args) {
        int a,b,c,d;
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数:");
        a=scanner.nextInt();
        b=a*a*a;
       System.out.printf("%d*%d*%d=%d\n",a,a,a,b);
        System.out.println("可分解为如下的数:");
        for(d=0,c=0;c<a;c++)//找到组成的奇数
        {
            d=d+(a*a-a+1+c*2);
            System.out.print(a*a-a+1+c*2);
            System.out.print(" ");
        }
    }
}

(五)亲密数

在这里我经过编程寻找3000之内的亲密数,对3000之内的数进行遍历,每次取出数a。利用求彻底数中运用的原理对n求它的正因子的和b,并对该整数和求它的正因子的和step,而后将a与step进行对比,若是这两数相等的话则a为亲密数。

public class Intimacy {
    public static void main(String[] args) {
        int a,find=0;
        int temp[] = new int[30],k=0;
        for(a=1;a<=3000;a++){
            int b=0;
            int step=0;
            for(int i=1;i<a;i++){
                if(a%i==0){
                    b=b+i;
                }
            }
            for(int j=1;j<b;j++){
                if(b%j==0){
                    step=step+j;
                }
            }
            if(step==a&&a!=b){
                temp[k]=b;
                k++;
                if(find==0) {
                    System.out.println("有亲密数为:" + a + "和" + b);
                }

            }
        }
    }
}

(六)勾股数

在这里我经过编程寻找100之内的勾股数,经过三个循环对全部100之内的数进行组合,若是有两数的平方和等于第三个数的平方,则这三个数为勾股数,并进行输出。代码以下:

public class Pytha {
    public static void main(String[] args) {
        int a,b,c;
        for(a=1;a<100;a++){//三个循环对全部边的状况进行判断
            for(b=2;b<100;b++){
                for(c=3;c<100;c++){
                    if(a*a+b*b==c*c&&a!=b&a!=c&&b!=c){//符合勾股定理则输出这三个数
                        System.out.println("有一组勾股数为:"+"a="+a+" "+"b=" +b+" "+"c="+c);
                    }
                }
            }
        }
    }
}

(七)四方定理

四方定理是一个数能够分为最多四个数的平方和,所以在这里我编程判断输入的数据可分解为哪几个数。一样使用例举的方法,对全部可能的组合进行遍历,若是它们的平方和等于分解前的数,则输出该组合。代码以下:

import java.util.Scanner;
public class Quartet {
    public static void main(String[] args) {
       int input;
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入一个数字:");
        input=scanner.nextInt();
        for(int i=1;i<=input;i++){//遍历全部组合
            for (int j=0;j<=i;j++){
                for(int m=0;m<=j;m++){
                    for(int n=0;n<=m;n++){
                        if(input==i*i+j*j+m*m+n*n){//输出符合要求的组合
                            System.out.println("该数可分解为:"+i+" "+j+" "+m+" "+n);
                        }
                    }
                }
            }
        }

    }
}

4、测试运行

因为这7个程序都不复杂,除了主方法没有编写其余的方法,不便于使用JUnit进行测试,但每次运行时都输出了了正确的结果,知足了题目的需求。如下是测试运行截图:
水仙花数:

彻底数:

亲密数:

回文数:

勾股数:

四方定理:

尼科彻斯定理:

5、核心代码

因为每一个程序都比较简单,我将大部分代码以及注释都放在了报告的第三部分。
码云连接

6、总结

实现趣味天然数的项目并不困难,可是在这一过程当中我了解了各类各样有趣的天然数,这拓宽了个人知识面,让我对天然数有了跟多的认识。

7、PSP

步骤 耗时 百分比
需求分析 20 13%
设计 30 19%
代码实现 70 45%
测试 20 13%
分析总结 15 10%
相关文章
相关标签/搜索