天天看點

藍橋杯-數的讀法

package jiChu;

import java.util.Scanner;

/**
問題描述
	Tom教授正在給研究所學生講授一門關于基因的課程,有一件事情讓他頗為頭疼:一條染色體上有成千上萬個堿基對,它們從0開始編号,到幾百萬,幾千萬,甚至上億。
	比如說,在對學生講解第1234567009号位置上的堿基時,光看着數字是很難準确的念出來的。 是以,他迫切地需要一個系統,然後當他輸入1234567009時,會給出相應的念法: 十二億三千四百五十六萬七千零九 用漢語拼音表示為 shi er yi san qian si bai wu shi liu wan qi qian ling jiu 
	這樣他隻需要照着念就可以了。
	你的任務是幫他設計這樣一個系統:給定一個阿拉伯數字串,你幫他按照中文讀寫的規範轉為漢語拼音字串,相鄰的兩個音節用一個空格符格開。
	注意必須嚴格按照規範,比如說“10010”讀作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”讀作“shi wan”而不是“yi shi wan”,“2000”讀作“er qian”而不是“liang qian”。
輸入格式 
	有一個數字串,數值大小不超過2,000,000,000。 
輸出格式 
	是一個由小寫英文字母,逗号和空格組成的字元串,表示該數的英文讀法。
樣例輸入
	1234567009 
樣例輸出 
	shi er yi san qian si bai wu shi liu wan qi qian ling jiu
 * 
 * @author Vivinia
 *
 *         2018年1月22日
 */
public class NumRead {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		input.close();
		appendString(n);
	}

	private static void appendString(int n) {
		int i, j;
		String[] num = { "ling ", "yi ", "er ", "san ", "si ", "wu ", "liu ", "qi ", "ba ", "jiu " };
		String[] w = { "", "shi ", "bai ", "qian ", "wan ", "shi ", "bai ", "qian ", "yi ", "shi ", "bai " };
		String ss = n + ""; // 把輸入的數轉換成字元串
		String buffer = new String();
		boolean l = true;
		// 第一次出現零
		for (i = 0; i < ss.length(); i++) {
			for (j = 0; j <= 9; j++)
				if (ss.charAt(i) == j + '0') { // 判斷字元串從第一個字元開始,每個字元等于0加幾,相當于擷取每個字元對應的數值
					break;
				}
			if ((ss.length() + 2) % 4 == 0 && i == 0 && j == 1) { // 10位數,6位數,2位數,并且第一個字元為1
				buffer += w[ss.length() - i - 1]; // 都為“shi”
			} else if (i != ss.length() - 1 && j == 0) { // 不是最後一個字元并且為0
				if (l) { // 未添加“ling”
					buffer += num[j]; // 添加一個“ling”
					l = false; // 已添加一個“ling”
				}
			} else if (i == ss.length() - 1 && j == 0) { // 最後一位且為0
				if (!l) // 如果已添加“ling”
					buffer = buffer.substring(0, buffer.length() - 5);// 如果最後一個也為0,則去掉之前添加的 ling
			} else { // 如果是普通的資料,則轉換
				buffer += num[j] + w[ss.length() - i - 1];
				l = true; // 出現真正的數字,後邊可以跟“ling”,設為true
			}
		}
		System.out.println(buffer);

	}

}
           

一開始走了彎路,後來參考的網上的代碼:

1.注意0的個數,連續出現的隻需要顯示一個“ling”

2.注意0的位置,當0在最後不需要出現“ling”

繼續閱讀