# String Conversion# Base Conversion# Greedy

f002 - Error

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入的字串轉換成不同的進制表示。如果字串以數字開頭,則將其視為十進制數字,並轉換為二十六進制表示(A=1, B=2, ..., Z=26)。如果字串以字母開頭,則將其視為二十六進制數字(A=1, B=2, ..., Z=26),並轉換為十進制數字。

解題思路

對於以數字開頭的字串,程式碼首先將其轉換為十進制數值。然後,它使用貪心策略將十進制數值轉換為二十六進制表示。在轉換過程中,每次從數值中減 1,然後將結果的餘數轉換為對應的字母(A-Z)。最後,反轉字串以獲得正確的二十六進制表示。

對於以字母開頭的字串,程式碼直接將其轉換為十進制數值。它將每個字母轉換為對應的數值(A=1, B=2, ..., Z=26),然後將這些數值相乘並相加,以獲得最終的十進制數值。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。因為需要遍歷字串進行轉換。
  • 空間複雜度: O(n),在最壞的情況下,二十六進制表示的長度可能與輸入字串的長度相同。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
long long n;
string s;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n;
	for(int i=0;i<n;++i){
		cin >> s;
		if(s[0]>='0'&&s[0]<='9'){
			long long v=0,ac=0;
			for(int j=0;j<s.size();++j){
				v*=10;
				v+=s[j]-'0';
			}
			string rt;
			while(v){
				--v;
				rt+=v%26+'A';
				v/=26;	
			}
			reverse(rt.begin(),rt.end());
			cout << rt << "\n";
		}
		else{
			long long v=0;
			for(int j=0;j<s.size();++j){
				v*=26;
				v+=s[j]-'A'+1;
			}
			cout << v << "\n";
		}
	} 
}

Discussion