d379 - 00446 - Kibbles n' Bits n' Bits `n' Bits
題目描述
題目要求讀取多組十六進位數的加法或減法運算式,並輸出運算數的二進位表示、運算符號、結果的二進位表示以及十進位結果。輸入的十六進位數最大為 FFF,且減法時第二個數永遠小於第一個數,保證結果非負。
解題思路
程式首先讀取輸入的十六進位數和運算符號。然後,將兩個十六進位數轉換為十進位數。接著,根據運算符號執行加法或減法運算。計算出十進位結果後,將兩個十六進位數和結果轉換為二進位表示。最後,按照題目要求的格式輸出二進位數、運算符號和十進位結果。
十六進位數轉換為十進位數的過程是,從最低位開始,將每個位數轉換為對應的十進位值,並乘以 16 的冪。二進位數的轉換則是將十進位數除以 2,直到商為 0,將每次的餘數作為二進位數的位數,從低位到高位排列。
複雜度分析
- 時間複雜度: O(N * L),其中 N 是運算式數量,L 是十六進位數的長度(最長為 3)。因為需要遍歷每個輸入,並進行十六進位到十進位和十進位到二進位的轉換。
- 空間複雜度: O(1),因為使用的額外空間是固定的,例如儲存十六進位數、二進位數和十進位結果的變數。
程式碼
#include <iostream>
#include <string>
using namespace std;
int main(){
string a,b,c;
cin >> a;
while(cin >> a >> b >> c){
int x=0,y=0;
string aa="0000000000000";
for(int i=a.length()-1,n=1;i>=0;i--,n*=16){
if(a[i]>'9')
x+=(a[i]-55)*n;
else
x+=(a[i]-48)*n;
}
for(int i=c.length()-1,n=1;i>=0;i--,n*=16){
if(c[i]>'9')
y+=(c[i]-55)*n;
else
y+=(c[i]-48)*n;
}
if(b=="+"){
int c=x+y;
for(int i=0,n=4096;i<aa.length();i++,n/=2){
if(x>=n){
aa[i]='1';
x-=n;
}
else
aa[i]='0';
}
cout << aa << " + ";
for(int i=0,n=4096;i<aa.length();i++,n/=2){
if(y>=n){
aa[i]='1';
y-=n;
}
else
aa[i]='0';
}
cout << aa << " = " << c << "\n";
}
else{
int c=x-y;
for(int i=0,n=4096;i<aa.length();i++,n/=2){
if(x>=n){
aa[i]='1';
x-=n;
}
else
aa[i]='0';
}
cout << aa << " - ";
for(int i=0,n=4096;i<aa.length();i++,n/=2){
if(y>=n){
aa[i]='1';
y-=n;
}
else
aa[i]='0';
}
cout << aa << " = " << c << "\n";
}
}
}