首先,隆重紀念該題一次通過!!!
問題描述
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碼之和與""(空串)