【語句總結】迴文序列各項之和問題中發現的java特性

                             首先,隆重紀念該題一次通過!!!


問題描述

  123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。
  輸入一個正整數n, 編程求所有這樣的五位和六位十進制數,滿足各位數字之和等於n 。

輸入格式

  輸入一行,包含一個正整數n。

輸出格式

  按從小到大的順序輸出滿足條件的整數,每個整數佔一行。

樣例輸入

52

樣例輸出

899998
989989
998899

數據規模和約定

  1<=n<=54。

我在本題使用了字符串轉數組的做法,大體思路爲遍歷各個序列,每遍歷到一個序列就將各項相加,若相加結果等於給定的數n則打印該序列。但由於迴文序列的對稱性,只需遍歷前三個數字,後面的數字在需要操作時可由前面的數字來代替(五位數時候後兩位是前兩位的倒序,六位數時後三位是前三位的倒序)。算法很簡單但是這個程序裏包含了很多java的特性,可以當例子來進行說明。以下是全部源碼。

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
    	Scanner in=new Scanner(System.in);
    	int n=in.nextInt();
    	int sum;
    	
    	for(int i=100;i<=999;i++) {//五位數情況
    		char chb[]=String.valueOf(i).toCharArray();//把前3位轉換成字符數組(chbegin)
    		char che[]=String.valueOf(i).substring(0,2).toCharArray();//把前2位轉換成字符數組(chend)
    		sum=Integer.valueOf(String.valueOf(chb[0]))
    				+Integer.valueOf(String.valueOf(chb[1]))
    				+Integer.valueOf(String.valueOf(chb[2]))
    				+Integer.valueOf(String.valueOf(che[1]))//後兩位是前兩位倒序
    				+Integer.valueOf(String.valueOf(che[0]));//五值相加
                    //要先把字符變字符串再變整數。若從字符變整數是asc碼
//    		System.out.println(chb[0]+chb[1]+chb[2]+che[1]+che[0]+"0");
//若只有字符相加,則是各自的asc碼相加。若在非結尾的地方添加字符串(空串也可以),則各個字符也會依次打印
    		if(sum==n) {
    			System.out.println(String.valueOf(chb[0])
                                        +String.valueOf(chb[1])
                                        +String.valueOf(chb[2])
                                        +String.valueOf(che[1])
                                        +String.valueOf(che[0]));
    		}
    	}
    	
    	for(int i=100;i<=999;i++) {//六位情況
    		char chb[]=String.valueOf(i).toCharArray();//把前3位轉換成字符數組(chbegin)
    		sum=Integer.valueOf(String.valueOf(chb[0]))
    				+Integer.valueOf(String.valueOf(chb[1]))
    				+Integer.valueOf(String.valueOf(chb[2]))
    				+Integer.valueOf(String.valueOf(chb[2]))
    				+Integer.valueOf(String.valueOf(chb[1]))//後三位是前三位倒序
    				+Integer.valueOf(String.valueOf(chb[0]));//六值相加
                    //要先把字符變字符串再變整數。若從字符變整數是asc碼
//    		System.out.println(chb[0]+chb[1]+chb[2]+che[1]+che[0]+"0");
//若只有字符相加,則是各自的asc碼相加。若在非結尾的地方添加字符串(空串也可以),則各個字符也會依次打印
    		if(sum==n) {
    			System.out.println(String.valueOf(chb[0])
                                    +String.valueOf(chb[1])
                                    +String.valueOf(chb[2])
                                    +String.valueOf(chb[2])
                                    +String.valueOf(chb[1])
                                    +String.valueOf(chb[0]));
    		}
    	}
    }
}

subString()

String.subString()的作用是截取子字符串,有兩種模式可以選擇。

public String substring(int beginIndex)
//或
public String substring(int beginIndex, int endIndex)

有一個參數的subString()返回從字符串的開頭開始,去掉beginIndex個字符後的子字符串,即從腳標爲beginIndex開始往後;有兩個參數的subString()返回從字符串的開頭開始,去掉beginIndex個字符後開始數,數到原字符串的第endIndex位結束的子字符串,即從腳標爲beginIndex到腳標爲endIndex。

兩種參數作爲數字都是整型。

valueOf()

當有一個參數時AAA.valueOf(BBB)的作用是將BBB變成AAA類型的數據。AAA和BBB可以是四種數據類型Integer, float, double和String。但在轉化爲數字的時候若BBB含有非數字的字符則會運行錯誤。                                                                                     當有兩個參數時Integer.valueOf(String s, int radix)的作用是將字符串s所表示的數字以radix所指定的進制轉化會十進制整數,即先假定參數s代表的數是“index進制數”,再將這個“index進制數”轉化爲十進制數。其中,返回值只能是整型(AAA是Integer),第一參數只能是字符串,第二參數只能是整型。若s中含有非數字的字符則會運行錯誤。

public class test {
	public static void main(String args[]) {
		String op="123";

		int i=Integer.valueOf(op);
		float f=Float.valueOf(op);
		double d=Double.valueOf(op);
		String s=String.valueOf(op);
		
		System.out.println(i);//結果是123
		System.out.println(f);//結果是123.0
		System.out.println(d);//結果是123.0
		System.out.println(s);//結果是123
	}
}

toCharArray()

String.toCharArray()的作用是將字符串變成與字符串等長的字符數組,這樣就可以將單獨處理每個字符。                                                   該方法沒有參數,必須對字符串對象使用。返回值是字符數類型char[]。                                                                                                   char型變量儲存的是字符,實際上是字符的ASC碼,若直接用char[i]進行輸出、運算等操作,得到的結果是char[i]所儲存的字符的ASC碼。

在計算序列各位數字之和的時候若直接用char[i]對其進行相加,則得到的是各項ASC碼的和。若直接將char[i]變成整型也只能是把ASC碼變成整型,還是無法得到字符所代表的數字。所以應該先將字符char[i]變成字符串,再將這個長度爲一個字符的字符串變成整型。

//錯×
sum=chb[0]+chb[1]+chb[2]+che[1]+che[2];
//錯×
sum=Integer.valueOf(chb[0])
    +Integer.valueOf(chb[1])
    +Integer.valueOf(chb[2])
    +Integer.valueOf(che[1])
    +Integer.valueOf(che[0]);
//對√
sum=Integer.valueOf(String.valueOf(chb[0]))
    +Integer.valueOf(String.valueOf(chb[1]))
    +Integer.valueOf(String.valueOf(chb[2]))
    +Integer.valueOf(String.valueOf(che[1]))
    +Integer.valueOf(String.valueOf(che[0]));//五值相加

同理,在打印的時候,也必須先將char[i]變成字符串再相加,即可得到滿足要求的序列。另外偶然間發現只要在序列中除結尾部的任意部位加一個字符串(即使是空串),也能讓每一個char[i]以字符的形式打印出來。

//若只有字符相加,則是各自的asc碼相加。
System.out.println(chb[0]+chb[1]+chb[2]+che[1]+che[0]);//結果是ASC碼之和

//先變成字符串再相加
System.out.println(String.valueOf(chb[0])
                         +String.valueOf(chb[1])
                         +String.valueOf(chb[2])
                         +String.valueOf(che[1])
                         +String.valueOf(che[0]));//結果是所求序列

//若在非結尾的地方添加字符串(空串也可以),則各個字符也會依次打印
System.out.println(""+chb[0]+chb[1]+chb[2]+che[1]+che[0]);//結果是所求序列
System.out.println(chb[0]+chb[1]+""+chb[2]+che[1]+che[0]);//結果是所求序列
System.out.println(chb[0]+chb[1]+chb[2]+che[1]+che[0]+"");//結果ASC碼之和與""(空串)

 

發佈了14 篇原創文章 · 獲贊 33 · 訪問量 9370
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章