p1102 十六進位制轉八進位制
阿新 • • 發佈:2018-12-02
題目
描述 Description
輸入一個不超過100,000位的16進位制數,請轉換成8進位制數。
注:16進位制數中,字母0-9還對應表示數字0-9,字母"A"(大寫)表示10,"B"表示11,…"F"表示15.
比如:16進位制數A10B表示的10進位制數是:1016^3 + 116^2 + 016^1 + 1116^0 = 41227. 轉換成的8進位制數是:
120413 :因為 18^5 + 28^4 + 08^3 + 48^2 + 18^1 + 38^0 = 41227.
提示:考慮它們與2進製表示的關係。
輸入格式 Input Format
一行,一個16進位制數。沒有前導0(除非是數字0)
輸出格式 Output Format
一個8進位制數。沒有前導0(除非是數字0)
樣例輸入 Sample Input
123ABC
樣例輸出 Sample Output
4435274
時間限制 Time Limitation
1s
註釋 Hint
來源 Source
usaco 月賽 hex
程式碼
#include<iostream>
#include<string>
using namespace std;
string a;
string num,m,n;
int main()
{
cin>>num;
if(num=="0") {cout<<0;return 0;}
for(int i=0;i<=num.size()-1;i++ )
{
if(num[i]=='0')
n=n+"0000";
if(num[i]=='1')
n=n+"0001";
if(num[i]=='2')
n=n+"0010";
if(num[i]=='3')
n=n+"0011";
if(num[i]=='4')
n=n+"0100";
if(num[i]=='5')
n=n+"0101";
if(num[i]=='6')
n=n+"0110";
if(num[i]=='7')
n=n+"0111";
if(num[i]=='8')
n=n+"1000";
if(num[i]=='9')
n= n+"1001";
if(num[i]=='A')
n=n+"1010";
if(num[i]=='B')
n=n+"1011";
if(num[i]=='C')
n=n+"1100";
if(num[i]=='D')
n=n+"1101";
if(num[i]=='E')
n=n+"1110";
if(num[i]=='F')
n=n+"1111";
}
int x=num.size()*4;
/*cout<<n;
printf("\n");*/
if(x%3==1)
{
x+=2;
n="00"+n;
}
if(x%3==2)
{
x+=1;
n='0'+n;
}
for(int i=1;i<=x-2;i=i+3)
{
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==0)
m=m+'0';
//cout<<0<<' '<<i<<endl;
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==1)
m=m+'1';
//cout<<1<<' '<<i<<endl;
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==10)
m=m+'2';
//cout<<2<<' '<<i<<endl;
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==11)
m=m+'3';
//cout<<3<<' '<<i<<endl;
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==100)
m=m+'4';
//cout<<4<<' '<<i<<endl;
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==101)
m=m+'5';
//cout<<5<<' '<<i<<endl;
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==110)
m=m+'6';
//cout<<6<<' '<<i<<endl;
if((n[i]-'0')*10+(n[i+1]-'0')+(n[i-1]-'0')*100==111)
m=m+'7';
//cout<<7<<' '<<i<<endl;
}
int h=0;
while(m[h]=='0')
h++;
for(int i=h;i<=m.size()-1;i++)
{
cout<<m[i];
}
return 0;
}