1. 程式人生 > 實用技巧 >PAT1001-A+B Format

PAT1001-A+B Format

題目描述

1001 A+B Format (20分)

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).

Input Specification:

Each input file contains one test case. Each case contains a pair of integers a and b where −106≤a

,b≤106. The numbers are separated by a space.

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.

Sample Input:

-1000000 9

Sample Output:

-999,991

作者

CHEN, Yue

單位

浙江大學

程式碼長度限制

16 KB

時間限制

400 ms

記憶體限制

64 MB

題目分析

整體分析:

題目的要求是要求進行兩個整數的相加運算,這一點並不困難,本題主要卡的地方在於要進行題目所要求的格式化輸出,同時還要注意本題輸入的兩個整數最大皆為10的六次方,即最大為七位數,考慮最極端情況兩個數均為1000000,即兩數相加最大值為2000000也為七位數,同時題目中要求低於四位數直接輸出即可(當前考慮的皆是在相加所得數為正整數的情況),假使相加為負值,先輸出減號然後按照正整數的格式進行輸出即可。

如何進行輸出?

可以考慮將整數分成三種進行輸出,分別是7位數,4-6位數以及4位數以下

題目解答

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
	int a = 0;
	int b = 0;

	cin >> a >> b;

	int sum = a + b;
	//當兩數相加值為負數時
	if (sum < 0)
	{
		//先輸出負號
		cout << "-";
		//然後將負數轉換成正數
		sum = -sum;
	}
	//當相加結果為七位數時
	if (sum >= 1000000)
	{
        //注意:setfill()函式所要填充的字元是在數字之前填充
        //如七位數的中間三個數字是010,最後取餘得到的值為10,
        //這時想要完美輸出010就需要使用setfill()函式
        //在前面填充一個‘0’
		cout << sum / 1000000
			<< "," << setw(3) << setfill('0') << (sum / 1000) % 1000
			<< "," << setw(3) << setfill('0') << sum % 1000;
	}
	//當相加結果為4-6位數時
	else if (sum >= 1000)
	{
		cout << sum / 1000 << "," << setw(3) << setfill('0') << sum % 1000;
	}
	//當相加結果為四位數以下時
	else
		cout << sum;

	system("pause");

	return 0;
}

檢測結果:

思考總結:

在本題的整數格式化輸出中,用到了setw()和setfill()函式,接下來介紹這兩種函式的用法:

  • 在C++中,setw(int n)用來控制輸出間隔
  • 例如:
  1. cout<<'s'<<setw(8)<<'a'<<endl;
  2. 則在螢幕顯示
  3. s a
  4. //s與a之間有7個空格,加上a就8個位置,setw()只對其後面緊跟的輸出產生作用,如上例中,表示'a'共佔8個位置,不足的用空格填充。若輸入的內容超過setw()設定的長度,則按實際長度輸出
  • setw()預設填充的內容為空格,可以setfill()配合使用設定其他字元填充。
  • 如:
  1. cout<<setfill('*')<<setw(5)<<'a'<<endl;
  2. 則輸出:
  3. ***a //4個和字元a共佔5個位置。
  • 所謂域寬,就是輸出的內容(數值或字元等等)需要佔據多少個字元的位置,如果位置有空餘則會自動補足。比如我們要設定域寬為2,那麼當輸出一位數1的時候輸出的就是“ 1”,即在1前面加了一個空格。空格和數字1正好一共佔用了兩個字元的位置。
  • 我 們在設定域寬和填充字元的時候要注意幾點
  1. ①設定域寬的時候應該填入*整數*,設定填充字元的時候應該填入字元
  2. ②我們可以對一個要輸出的內容同時設定域寬和 填充字元,但是設定好的屬性僅對下一個輸出的內容有效,之後的輸出要再次設定。即 cout <<setw(2) <<a <<b;語句中域寬設定僅對a有效,對b無效。
  3. ③setw和setfill 被稱為輸出控制符,使用時需要在程式開頭寫上#include "iomanip.h",否則無法使用。
#include <iostream>



#include<iomanip>



using namespace std;



int main()



{



    cout<<'s'<<setfill('*')<<setw(8)<<'a'<<endl;



    return 0;



}



 



 

輸出結果如下: