# String Manipulation# Base Conversion# Arithmetic# Input/Output

d379 - 00446 - Kibbles n' Bits n' Bits `n' Bits

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取多組十六進位數的加法或減法運算式,並輸出運算數的二進位表示、運算符號、結果的二進位表示以及十進位結果。輸入的十六進位數最大為 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";
		}
	}
}

Discussion