c089 - 00389 - Basically Speaking
題目描述
題目要求將一個給定的數字從一個進制轉換到另一個進制,並在一個 7 位數的顯示器上顯示結果。如果結果太大無法顯示,則輸出 "ERROR"。輸入包含多組測試資料,每組資料包含要轉換的數字(字串形式)、原始進制和目標進制。
解題思路
程式首先將輸入的字串轉換為十進制數。然後,將十進制數轉換為目標進制,並將結果儲存在一個字串中。最後,檢查字串的長度是否超過 7。如果超過,則輸出 "ERROR";否則,將字串右對齊到 7 位數並輸出。
程式碼中,首先讀取輸入的字串 a、原始進制 b 和目標進制 c。然後,使用迴圈將字串 a 轉換為十進制數 ans。在轉換過程中,如果字元是數字,則將其轉換為對應的整數值;如果字元是大寫字母,則將其轉換為 10 到 15 的值。
接下來,程式將十進制數 ans 轉換為目標進制 c。在轉換過程中,使用迴圈計算 ans 除以 c 的餘數,並將餘數轉換為對應的字元(如果餘數大於 9,則使用字母 A 到 F)。將字元添加到字串 a2 中。
最後,程式檢查字串 a2 的長度是否超過 7。如果超過,則輸出 "ERROR";否則,將字串 a2 反轉,並使用 setw(7) 將其右對齊到 7 位數並輸出。
複雜度分析
- 時間複雜度: O(N + log(ans)),其中 N 是輸入字串的長度,ans 是轉換後的十進制數。轉換字串到十進制需要 O(N) 時間,轉換十進制到目標進制需要 O(log(ans)) 時間。
- 空間複雜度: O(log(ans)),主要用於儲存轉換後的字串。
程式碼
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
string a;
long long int b,c;
while(cin >> a >> b >> c){
long long int ans=0;
string a2;
for(int i=0,al=a.length();i<al;++i){
ans*=b;
if(a[i]<='9')
ans+=a[i]-48;
else
ans+=(a[i]-'A'+10);
}
if(ans==0)
cout << " 0\n";
else{
while(ans){
long long int k=ans%c;
if(k>=10)
a2+=k+'A'-10;
else
a2+=k+'0';
ans/=c;
}
if(a2.length()>7)
cout << " ERROR\n";
else{
reverse(a2.begin(),a2.end());
cout << setw(7) << a2 << "\n";
}
}
}
}