#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
// 印出二進位的部分
void printBin(string num, vector<int>& digits);
// 印出以十進位表示的結果的部分
// 運算在這裡進行 (use if and else)
void printSum(vector<int> vectorNum1, string oper, vector<int> vectorNum2);
int main()
{
int N; // 測資數量
cin >> N;
cin.get();
while (N--)
{
string num1, oper, num2; // number1, + or -, number2
cin >> num1 >> oper >> num2;
vector<int> vectorNum1, vectorNum2; // 二進位的 num1, num2 (only 1 or 0 inside)
printBin(num1, vectorNum1); // 先將 num1 二進位印出
cout << " " << oper << " ";
printBin(num2, vectorNum2); // 再
將 num2 二進位印出
cout << " = ";
printSum(vectorNum1, oper, vectorNum2); // 最後將
十進位表示的結果印出
cout << endl;
}
return 0;
}
void printBin(string num, vector<int>& digits)
{
int digit = 0;
// 因為是十六進位 所以會有字母 先判斷是字母還是數字 然後再變成十進位
for (int i = 0; i < num.length(); i++)
{
if (num[i] >= '0' && num[i] <= '9')
{
digit = num[i] - '0';
}
else if (num[i] >= 'A' && num[i] <= 'F')
{
digit = num[i] - 'A' + 10;
}
// 十進位後再變成二進位
while (digit > 0)
{
digits.push_back(digit % 2);
digit /= 2;
}
}
// 剩下的用 0 填滿 題目需要
while (digits.size() < 13)
{
digits.push_back(0);
}
// 印出 (倒過來印出)
for (int i = digits.size() - 1; i >= 0; i--)
{
cout << digits[i];
}
}
void printSum(vector<int> vectorNum1, string oper, vector<int> vectorNum2)
{
int sum = 0;
if (oper == "+")
{
for (int i = 12; i >= 0; i--)
{
sum += (vectorNum1[i] * pow(2, i) + vectorNum2[i] * pow(2, i));
}
}
else if (oper == "-")
{
for (int i = 12; i >= 0; i--)
{
sum += (vectorNum1[i] * pow(2, i) - vectorNum2[i] * pow(2, i));
}
}
cout << sum;
}
for (int i = 0; i < num.length(); i++)
{
if (num[i] >= '0' && num[i] <= '9')
{
digit = num[i] - '0';
}
else if (num[i] >= 'A' && num[i] <= 'F')
{
digit = num[i] - 'A' + 10;
}
// 十進位後再變成二進位
while (digit > 0)
{
digits.push_back(digit % 2);
digit /= 2;
}
}
// 剩下的用 0 填滿 題目需要
while (digits.size() < 13)
{
digits.push_back(0);
}
// 印出 (倒過來印出)
for (int i = digits.size() - 1; i >= 0; i--)
{
cout << digits[i];
}
}
printBin()這邊有兩個錯誤:
1. 十進位轉二進位,你轉出來的數字可能有0到4位數,如果十六進位的數字有多個位數就會有問題。
2. 最後你把二進位整個顛倒過來,不過造成十六進位的位數倒過來了(例如ABC會變成CBA),可以把一開始的for迴圈也倒過來就正常了
printBin()這邊有兩個錯誤:
1. 十進位轉二進位,你轉出來的數字可能有0到4位數,如果十六進位的數字有多個位數就會有問題。
2. 最後你把二進位整個顛倒過來,不過造成十六進位的位數倒過來了(例如ABC會變成CBA),可以把一開始的for迴圈也倒過來就正常了
抱歉我還是不能理解,我用我理解的方式改了還是錯的
printBin()這邊有兩個錯誤:
1. 十進位轉二進位,你轉出來的數字可能有0到4位數,如果十六進位的數字有多個位數就會有問題。
2. 最後你把二進位整個顛倒過來,不過造成十六進位的位數倒過來了(例如ABC會變成CBA),可以把一開始的for迴圈也倒過來就正常了
抱歉我還是不能理解,我用我理解的方式改了還是錯的
我舉個例子:
1
ABC + 111
1. 16是2的4次方,所以十六進位每個位數會對應二進位的4個位數,例如轉換111時,會變成0001 0001 0001,但是你的迴圈while (digit > 0)執行的次數是不固定的,轉出來還是111,結果就錯了
2. 你最後面倒過來應該是因為while迴圈裡面除以2取餘數會變成顛倒的吧?不知道該怎麼解釋,我用ABC舉例:
A轉為1010,B轉為1011,C轉為1100,所以正確應該是1010 1011 1100
而你的vector裡面A是{0,1,0,1},B是{1,1,0,1},C是{0,0,1,1},所以你倒過來,卻變成
1100 1011 1010
C B A
1. 16是2的4次方,所以十六進位每個位數會對應二進位的4個位數,例如轉換111時,會變成0001 0001 0001,但是你的迴圈while (digit > 0)執行的次數是不固定的,轉出來還是111,結果就錯了
意思是前面的0被吃掉了
1. 16是2的4次方,所以十六進位每個位數會對應二進位的4個位數,例如轉換111時,會變成0001 0001 0001,但是你的迴圈while (digit > 0)執行的次數是不固定的,轉出來還是111,結果就錯了
意思是前面的0被吃掉了
謝謝你!了解!