UVa 10473
題目
http://domen111.github.io/UVa-Easy-Viewer/?10473
給一個字串 $S$ ,若 $S$ 是以 0x
開頭表示為 $16$ 進位,否則為 $10$ 進位
如果輸入 $16$ 進位,則輸出 $10$ 進位
如果輸入 $10$ 進位,則輸出 $16$ 進位
想法
- 先將 $S$ 想辦法換成我們熟悉的數字表示方式十進位
- 統一從十進位轉換為其他進位制
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include<iostream> #include<cmath> using namespace std; int main(){ string s; while(cin>>s){ if(s[0]=='-'){ break; } if(s.size()>2 && s[1] == 'x'){ long long ans=0; for(int i=s.size()-1, j=0 ; i>=2 ; i--, j++){ if(s[i]<='9') ans+=(s[i]-'0')*pow(16, j); else ans+=(s[i]-'A'+10)*pow(16, j); } cout<<ans<<"\n"; } else{ long long num = 0; for(int i=s.size()-1, j=0 ; i>=0 ; i--, j++){ num += (s[i]-'0')*pow(10, j); } string ans=""; for( ; num ; num/=16){ int m = num%16; if(m>=10){ ans = char(m-10+'A') + ans; } else{ ans = char(m+'0') + ans; } } cout<<"0x"<<ans<<"\n"; } } return 0; }
|
複雜度分析
每種轉換方式的時間複雜度皆為 $O(log_{10}{n})$