#29944: WA ... 求助!


narutoooo1771@gmail.com (トンカツ)

學校 : 元智大學
編號 : 183752
來源 : [140.138.234.136]
最後登入時間 :
2022-04-21 14:21:50
d379. 00446 - Kibbles `n' Bits `n' Bits `n' Bits -- UVa446 | From: [140.138.242.96] | 發表日期 : 2022-04-14 19:44

#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;

}

 
#29946: Re:WA ... 求助!


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
d379. 00446 - Kibbles `n' Bits `n' Bits `n' Bits -- UVa446 | From: [39.9.234.113] | 發表日期 : 2022-04-14 21:13

 

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迴圈也倒過來就正常了

 
#29947: Re:WA ... 求助!


narutoooo1771@gmail.com (トンカツ)

學校 : 元智大學
編號 : 183752
來源 : [140.138.234.136]
最後登入時間 :
2022-04-21 14:21:50
d379. 00446 - Kibbles `n' Bits `n' Bits `n' Bits -- UVa446 | From: [140.138.242.96] | 發表日期 : 2022-04-14 23:43

printBin()這邊有兩個錯誤:

1. 十進位轉二進位,你轉出來的數字可能有0到4位數,如果十六進位的數字有多個位數就會有問題。

2. 最後你把二進位整個顛倒過來,不過造成十六進位的位數倒過來了(例如ABC會變成CBA),可以把一開始的for迴圈也倒過來就正常了

抱歉我還是不能理解,我用我理解的方式改了還是錯的

 
#29948: Re:WA ... 求助!


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
d379. 00446 - Kibbles `n' Bits `n' Bits `n' Bits -- UVa446 | From: [39.9.234.113] | 發表日期 : 2022-04-15 10:10

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

 
#29949: Re:WA ... 求助!


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
d379. 00446 - Kibbles `n' Bits `n' Bits `n' Bits -- UVa446 | From: [39.9.234.113] | 發表日期 : 2022-04-15 10:12

1. 16是2的4次方,所以十六進位每個位數會對應二進位的4個位數,例如轉換111時,會變成0001 0001 0001,但是你的迴圈while (digit > 0)執行的次數是不固定的,轉出來還是111,結果就錯了


意思是前面的0被吃掉了

 
#29950: Re:WA ... 求助!


narutoooo1771@gmail.com (トンカツ)

學校 : 元智大學
編號 : 183752
來源 : [140.138.234.136]
最後登入時間 :
2022-04-21 14:21:50
d379. 00446 - Kibbles `n' Bits `n' Bits `n' Bits -- UVa446 | From: [140.138.242.96] | 發表日期 : 2022-04-15 10:47

1. 16是2的4次方,所以十六進位每個位數會對應二進位的4個位數,例如轉換111時,會變成0001 0001 0001,但是你的迴圈while (digit > 0)執行的次數是不固定的,轉出來還是111,結果就錯了


意思是前面的0被吃掉了


謝謝你!了解!

 
ZeroJudge Forum