根據題目要求,咱們須要瞭解如下幾種特殊的天然數: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
因爲這些數據只能經過其特徵來判斷或者生成,沒法像Integer等數據編寫具體的類來表示這一類數據,因此我經過編寫不一樣的程序在必定的範圍內尋找或判斷輸入的數據是否爲這7種類型的數中的某種特定的數。code
直接對全部三位數進行遍歷,將三位數的個、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); } } } } } } }
因爲這7個程序都不復雜,除了主方法沒有編寫其餘的方法,不便於使用JUnit進行測試,但每次運行時都輸出了了正確的結果,知足了題目的需求。如下是測試運行截圖:
水仙花數:
徹底數:
親密數:
迴文數:
勾股數:
四方定理:
尼科徹斯定理:
因爲每一個程序都比較簡單,我將大部分代碼以及註釋都放在了報告的第三部分。
碼雲連接
實現趣味天然數的項目並不困難,可是在這一過程當中我瞭解了各類各樣有趣的天然數,這拓寬了個人知識面,讓我對天然數有了跟多的認識。
步驟 | 耗時 | 百分比 |
---|---|---|
需求分析 | 20 | 13% |
設計 | 30 | 19% |
代碼實現 | 70 | 45% |
測試 | 20 | 13% |
分析總結 | 15 | 10% |