20175320个人项目-趣味自然数

个人项目-趣味自然数

一、需求分析

根据题目要求,我们需要了解以下几种特殊的自然数:

(一)水仙花数

水仙花数也被称为超完全数字不变数。如果一个数是一个 3 位数,且它的每个位上的数字的 3次幂之和等于它本身,那么这个数就是一个水仙花数。

(二)完全数

如果一个数恰好等于它的因子之和(数字自身除外),则称该数为完全数。

(三)回文数

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

(三)尼科彻斯定理

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

(五)亲密数

如果a的所有正因子和等于b,b的所有正因子和等于a,因子包括1但不包括本身,且a不等于b,则称a,b为亲密数对。

(六)勾股数

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

(七)四方定理

四方定理是数论中著名的一个定理,指所有自然数至多只要用四个数的平方和就可以表示。

二、功能设计

由于这些数据只能通过其特征来判断或者生成,无法像Integer等数据编写具体的类来表示这一类数据,所以我通过编写不同的程序在一定的范围内寻找或判断输入的数据是否为这7种类型的数中的某种特定的数。

三、设计实现

(一)水仙花数

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

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
",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);
                        }
                    }
                }
            }
        }

    }
}

四、测试运行

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

完全数:

亲密数:

回文数:

勾股数:

四方定理:

尼科彻斯定理:

五、核心代码

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

六、总结

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

七、PSP

步骤 耗时 百分比
需求分析 20 13%
设计 30 19%
代码实现 70 45%
测试 20 13%
分析总结 15 10%
原文地址:https://www.cnblogs.com/nameless-student/p/10927084.html