十六進制數轉八進制 大數轉化


題目:

問題描述   給定n個十六進制正整數,輸出它們對應的八進制數。 輸入格式   輸入的第一行為一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式   輸出n行,每行為輸入對應的八進制正整數。 注意   輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。
樣例輸入 2
39
123ABC
樣例輸出 71
4435274

思路: 先轉化為2進制,然后再轉化為八進制。

數學上容易證明,2進制和十六進制的轉化就是美4位取一為一組。 轉化為8進制就是每3位取為一組。

由於4*n=n(mod3),所以要對length對3的余數進行討論。


代碼:

#include<iostream>
#include<vector>
#include<string>
using namespace std;


int getDigit(char c)
{
if(c=='0') return 0;

else if(c=='1') return 1;

else if(c=='2') return 2;

else if(c=='3') return 3;

else if(c=='4') return 4;

else if(c=='5') return 5;

else if(c=='6') return 6;

else if(c=='7') return 7;

else if(c=='8') return 8;

else if(c=='9') return 9;

else if(c=='A') return 10;

else if(c=='B') return 11;

else if(c=='C') return 12;

else if(c=='D') return 13;

else if(c=='E') return 14;

else if(c=='F') return 15;

return -1;


}

int p[100000];
int q[400000];
int r[100000];

int g[3]={1,2,4};


int main()
{
int n;
cin>>n;

string s;
while(n--)
{
cin>>s;

int length=s.length();
{

for(int i=0;i<length;i++)
p[i]=getDigit(s[i]);
for(int i=0;i<length;i++)
{
for(int j=3;j>=0;j--)
{
q[4*i+j]=p[i]%2;
p[i]/=2;
}
}

// for(int i=0;i<4*length;i++)
// cout<<q[i]<<" ";
// cout<<endl;
//

if(length%3==0)
{
bool flag=0;

for(int i=0;i<4*length;i+=3)
{
int temp=0;
for(int j=2;j>=0;j--)
{
temp+=g[j]*q[i+2-j];

}
if(flag==0&&temp)
{ cout<<temp;
flag=1;
}

else cout<<temp;

}
cout<<endl;
}
else if(length%3==1)
{
bool flag=0;

if(q[0])
{
cout<<q[0];
flag=1;

}
for(int i=1;i<4*length;i+=3)
{
int temp=0;
for(int j=2;j>=0;j--)
{
temp+=g[j]*q[i+2-j];

}
if(flag==0&&temp)
{ cout<<temp;
flag=1;
}

else cout<<temp;

}
cout<<endl;
}
else if(length%3==2)

{

bool flag=0;

if(q[0]*2+q[1])
{
cout<<q[0]*2+q[1];
flag=1;

}
for(int i=2;i<4*length;i+=3)
{
int temp=0;
for(int j=2;j>=0;j--)
{
temp+=g[j]*q[i+2-j];

}
if(flag==0&&temp)
{ cout<<temp;
flag=1;
}

else cout<<temp;

}
cout<<endl;

}


}

}

}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com