1. 程式人生 > >PAT——1049. 數列的片段和

PAT——1049. 數列的片段和

給定一個正數數列,我們可以從中擷取任意的連續的幾個數,稱為片段。例如,給定數列{0.1, 0.2, 0.3, 0.4},我們有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 這10個片段。

給定正整數數列,求出全部片段包含的所有的數之和。如本例中10個片段總和是0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

輸入格式:

輸入第一行給出一個不超過105的正整數N,表示數列中數的個數,第二行給出N個不超過1.0的正數,是數列中的數,其間以空格分隔。

輸出格式:

在一行中輸出該序列所有片段包含的數之和,精確到小數點後2位。

輸入樣例:

4
0.1 0.2 0.3 0.4 

輸出樣例:

5.00


 1 package com.hone.basical;
 2 
 3 import java.util.Scanner;
 4 import java.util.Stack;
 5 
 6 /**
 7  * 題目中規定:數字最長為100位,則通過一般的數肯定會越界,可以考慮使用字串
 8  * 這類題目都可以考慮利用字串來處理資料的進位制轉化。
 9  * @author Xia
10  *
11  */
12 public class basicalLevel1048encryptNUm2 {
13 14 public static void main(String[] args) { 15 16 Scanner in = new Scanner(System.in); 17 String a = in.next(); //用字串a表示數A 18 String b = in.next(); //用字串b表示數B 19 in.close(); 20 21 int i = a.length() - 1; 22 int j = b.length() - 1;
23 24 //首先補全位數 25 if (i > j) { 26 int c = i - j; 27 while (c != 0) { 28 b = "0" + b; 29 c--; 30 } 31 } else if (i < j) { 32 int c = j - i; 33 while (c != 0) { 34 a = "0" + a; 35 c--; 36 } 37 } 38 39 int index = b.length() - 1; // 採用一種倒敘的方法 40 boolean isOdd = true; 41 Stack<String> stack = new Stack<>(); 42 while (index >= 0) { 43 if (isOdd) { 44 isOdd = false; 45 int cNumber = a.charAt(index) - '0' + b.charAt(index) - '0'; 46 String r = null; 47 switch (cNumber) { 48 case 10: 49 r = "J"; 50 break; 51 case 11: 52 r = "Q"; 53 break; 54 case 12: 55 r = "K"; 56 break; 57 default: 58 r = "" + cNumber % 13; 59 break; 60 } 61 62 stack.push(r); 63 } else { 64 isOdd = true; 65 int cNumber = (b.charAt(index) - a.charAt(index) + 10) % 10; 66 String r = "" + cNumber; 67 stack.push(r); 68 } 69 index--; 70 } 71 72 while (!stack.isEmpty()) { 73 System.out.print(stack.pop()); 74 } 75 } 76 77 }