PAT甲級考試題庫1001 A+B Format 代碼實現及相關知識學習

準備參加九年九月份的PAT甲級證書考試,對網站上的題目進行總結分析:html

1001題 A+B Format (20 分)java

Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).git

計算a+b的值並以必定格式輸出其和sum(數字須要以每三個數字爲一組來輸出,中間以逗號隔開)當sum低於四位數的時候不須要以逗號隔開編程

Input Specification:

Each input file contains one test case. Each case contains a pair of integers a and b where 106​​a,b106​​. The numbers are separated by a space.segmentfault

Output Specification:

For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.api

Sample Input:

-1000000 9

Sample Output:

-999,991

代碼實現:oracle

 

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int a = in.nextInt(); int b = in.nextInt(); int sum; sum=a+b; if(Math.abs(sum)<1000) { System.out.println(sum); } else { System.out.format("%,d%n",sum); } } } }

運行截圖:less

問題分析:編程語言

簡單的數字相加問題,要拿到滿分的關鍵不在數字相加上,而在與如何按照題目中要求的格式輸出最後相加的數字,經過這個問題我也學到了一些東西,接下來進行總結:ide

 

當sum的絕對值小於1000時,正常輸出便可。

當sum的絕對值大於等於1000時,須要按格式輸出。在代碼中主要用到System.out.format()的方法,接下來對其進行介紹。

 

從下面兩個連接中學到了不少:https://segmentfault.com/a/1190000017828119

                                                   https://blog.csdn.net/u012246458/article/details/52634175

在前面的學習中咱們已經看到使用printprintln方法將字符串打印到標準輸出(System.out),因爲全部數字均可以轉換爲字符串,你可使用這些方法打印出任意的字符串和數字混合,可是,Java編程語言還有其餘方法,能夠在包含數字時對打印輸出進行更多控制。

printf和format方法

java.io包中包含一個PrintStream類,它有兩種格式化方法可用於替換printprintln,這些方法,formatprintf,彼此相同。你一直使用的熟悉的System.out剛好是PrintStream對象,所以你能夠在System.out上調用PrintStream方法,所以,你能夠在之前使用printprintln的代碼中的任何位置使用formatprintf,例如:

System.out.format(.....);

格式說明符以百分號()開頭,以轉換器結束,轉換器是一個字符,指示要格式化的參數類型,在百分號()和轉換器之間,你可使用可選的標誌和說明符,java.util.Formatter中記錄了許多轉換器、標誌和說明符。

這是一個基本的例子:

int i = 461012; System.out.format("The value of i is: %d%n", i);

%d指定單個變量是十進制整數,%n是與平臺無關的換行符,輸出是:

 
The value of i is: 461012

下表列出了表格後面的示例程序TestFormat.java中使用的一些轉換器和標誌。


如下程序顯示了你可使用格式進行的一些格式化,輸出顯示在嵌入註釋中的雙引號內
TestFormat.java
import java.util.Calendar; import java.util.Locale; public class TestFormat { public static void main(String[] args) { long n = 461012; System.out.format("%d%n", n);      // --> "461012"
      System.out.format("%08d%n", n);    // --> "00461012"
      System.out.format("%+8d%n", n);    // --> " +461012"
      System.out.format("%,8d%n", n);    // --> " 461,012"
      System.out.format("%+,8d%n%n", n); // --> "+461,012"
      
      double pi = Math.PI; System.out.format("%f%n", pi);       // --> "3.141593"
      System.out.format("%.3f%n", pi);     // --> "3.142"
      System.out.format("%10.3f%n", pi);   // --> " 3.142"
      System.out.format("%-10.3f%n", pi);  // --> "3.142"
 System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416"
 Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006"
 System.out.format("%tl:%tM %tp%n", c, c, c);  // --> "2:34 am"
 System.out.format("%tD%n", c);    // --> "05/29/06"
 } }

DecimalFormat類

你可使用java.text.DecimalFormat類來控制前導和尾隨零、前綴和後綴、分組(千)分隔符和小數分隔符的顯示,DecimalFormat在數字格式化方面提供了極大的靈活性,但它使你的代碼更復雜。

下面的示例經過將模式字符串傳遞給DecimalFormat構造函數來建立DecimalFormat對象myFormatter。而後,myFormatter會調用DecimalFormatNumberFormat繼承的format()方法 — 它接受double值做爲參數,並返回字符串中的格式化數字:

這是一個示例程序,說明了DecimalFormat的用法:

import java.text.*; public class DecimalFormatDemo { static public void customFormat(String pattern, double value ) { DecimalFormat myFormatter = new DecimalFormat(pattern); String output = myFormatter.format(value); System.out.println(value + "  " + pattern + "  " + output); } static public void main(String[] args) { customFormat("###,###.###", 123456.789); customFormat("###.##", 123456.789); customFormat("000000.000", 123.78); customFormat("$###,###.###", 12345.67); } }

輸出是:

123456.789  ###,###.###  123,456.789
123456.789  ###.##  123456.79
123.78  000000.000  000123.780
12345.67  $###,###.###  $12,345.67

下表說明了每行輸出:

一些具體實例:

 

DecimalFormat format 方法 你們在format()一個小數是,老是對格式中的'0'和'#'有些不解吧! eg: 1:new DecimalFormat("00.000").format(pi) //結果:03.142

    2:new DecimalFormat("##.###").format(pi) //結果:3.142
 都是對pi進行格式化,但第一個的結果是03.142,第二個的結果是3.142 這是什麼緣由呢? 0和#都是佔位符,但在不一樣的地方,做用不同。下面對他們作了具體的比較。 但願對你們有所幫助。 0: 比實際數字的位數多,不足的地方用0補上。 new DecimalFormat("00.00").format(3.14)  //結果:03.14

    new DecimalFormat("0.000").format(3.14)  //結果: 3.140

    new DecimalFormat("00.000").format(3.14)  //結果:03.140
 比實際數字的位數少:整數部分不改動,小數部分,四捨五入 new DecimalFormat("0.000").format(13.146)  //結果:13.146

    new DecimalFormat("00.00").format(13.146)  //結果:13.15

    new DecimalFormat("0.00").format(13.146)  //結果:13.15
 #: 比實際數字的位數多,不變。 new DecimalFormat("##.##").format(3.14)  //結果:3.14

    new DecimalFormat("#.###").format(3.14)  //結果: 3.14

    new DecimalFormat("##.###").format(3.14)  //結果:3.14
 比實際數字的位數少:整數部分不改動,小數部分,四捨五入 new DecimalFormat("#.###").format(13.146)  //結果:13.146

    new DecimalFormat("##.##").format(13.146)  //結果:13.15

    new DecimalFormat("#.##").format(13.146)  //結果:13.15


其餘的一些用法,(添加百分號,千分號,科學計數法,自定義正負數模板)
可參照
http://jff.iteye.com/blog/576737
http://blog.csdn.net/marcoleung/article/details/176514

BigDecimal類:

因爲1中的方法保留兩位小數,最後一位會四捨五入,因此用BigDecimal 來截取小數點後兩位

下面是相關的方法:

BigDecimal.setScale()方法用於格式化小數點 setScale(1)表示保留一位小數,默認用四捨五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3 setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4 setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,若是是5則向下舍 setScaler(1,BigDecimal.ROUND_CEILING)接近正無窮大的舍入 setScaler(1,BigDecimal.ROUND_FLOOR)接近負無窮大的舍入,數字>0和ROUND_UP做用同樣,數字<0和ROUND_DOWN做用同樣 setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。 註釋: 1:scale指的是你小數點後的位數。好比123.456則score就是3. score()就是BigDecimal類中的方法啊。 好比:BigDecimal b = new BigDecimal("123.456"); b.scale(),返回的就是3. 2:roundingMode是小數的保留模式。它們都是BigDecimal中的常量字段,有不少種。 好比:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。 3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 的意思是說:我用一個BigDecimal對象除以divisor後的結果,而且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊仍是其它的,你能夠本身選! 4:對於通常add、subtract、multiply方法的小數位格式化以下: BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("mData=" + mData); ----結果:----- mData=9.66

END(之後如有相關知識會繼續補充)

相關文章
相關標籤/搜索