1. 程式人生 > >題解報告:hdu 2057 A + B Again

題解報告:hdu 2057 A + B Again

裏的 while 解決 機會 打印 hdoj 多個 AC 使用

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2057

問題描述

  我們的HDOJ必須有許多A + B問題,現在又有新的問題出現。 給你兩個十六進制整數,你的任務是計算它們的總和,並以十六進制打印它。 簡單 ? AC它!

輸入

   輸入包含多個測試用例,請處理至文件末尾。 每個情況由兩個十六進制整數A和B組成,並由一個空格分隔。 A和B的長度小於15。

輸出

  對於每個測試用例,在一行中以十六進制格式打印A和B的總和。

示例輸入

+ A -A

+ 1A 12

1A -9

-1A -12

1A -AA

示例輸出

0

2C

11

-2C

-90

解題思路:這是一道關於16進制加法。剛開始想用模擬大數那樣的方法來先轉化成10進制,再轉化成16進制輸出,但想到有%X這個輸出格式控制符,於是就換了種寫法。經過對%X的查閱了解,解決這題可以用%I64X(這裏的‘X‘是大寫),也可以用long long來處理,要註意到16進制中負數是用補碼來表示的,計算機會自己處理16進制加法的,所以不必采用模擬法。因為長度是小於15(即15位),在long long (__int64)(即19位)數據的範圍內,所以直接使用它們,但要註意的是如果計算結果是負數的話,由於%I64X 輸出格式是輸出一個unsigned long long int,無符號64位正整數,前面加負號讓其轉換成有符號的64位,並輸出單獨加個‘-‘(負號)。下面給出這兩種寫法:

AC代碼:

寫法一:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     __int64 A,B;
 6     while(~scanf("%I64X %I64X",&A,&B)){
 7         if(A+B<0)printf("-%I64X\n",-(A+B));
 8         else printf("%I64X\n",(A+B));
 9     }
10     return 0;
11 }

寫法二:(註意輸出格式是大寫的‘X‘)

 1
#include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 long long A,B; 6 while(~scanf("%llX %llX",&A,&B)){ 7 if(A+B<0)printf("-%llX\n",-(A+B)); 8 else printf("%llX\n",(A+B)); 9 } 10 return 0; 11 }

題解報告:hdu 2057 A + B Again