八進制轉換成十六進制:
先將八進制轉換爲二進制。一個八進制位對應三個二進制位,再將二進制轉換爲十六進制,四個二進制位對應一個十六進制位。
代碼如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char strD[100000+11];
int strB[400000+11];
char strH[300000+11];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",strH);
int len1=strlen(strH);
if(len1==1&&strH[0]=='0')
{
printf("0\n");
continue;
}
int j;
int ans=0;
for(int i=len1-1;i>=0;i--)
{
int flag=strH[i]-'0';
j=3;
while(j--)
{
strB[ans++]=flag%2;
flag>>=1;
}
}
//int k=ans;
ans=ans+4-ans%4;
ans--;
while(strB[ans]*8+strB[ans-1]*4+strB[ans-2]*2+strB[ans-3]==0)
ans-=4;
for(int i=ans;i>=0;i-=4)
{
int sum=strB[i]*8+strB[i-1]*4+strB[i-2]*2+strB[i-3];
if(sum<=9)
printf("%d",sum);
else
{
char ch=sum-10+'A';
printf("%c",ch);
}
}
printf("\n");
}
return 0;
}
十進制轉換成十六進制,依次除以16,取餘數,先得到的餘數最後輸出,用棧的數據結構。
代碼如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
typedef unsigned long long ULL;
using namespace std;
int main()
{
ULL n;
stack<char> sta;
char ch;
while(~scanf("%ulld",&n))
{
if(n==0)
{
printf("0\n");
continue;
}
while(n)
{
int flag=n%16;
if(flag<=9)
ch=flag+'0';
else
ch=flag-10+'A';
sta.push(ch);
n/=16;
}
while(!sta.empty() )
{
char ans=sta.top() ;
printf("%c",ans);
sta.pop() ;
}
printf("\n");
}
return 0;
}
十六進制轉換成十進制,按位乘以16的n次冪。
代碼如下:
#include<cstdio> //按位乘以權值
#include<cstring>
#include<algorithm>
using namespace std;
char strD[10000000+11];
int main()
{
while(~scanf("%s",strD))
{
int len1=strlen(strD);
int flag;
long long sum=0,k=1;
for(int i=len1-1;i>=0;i--)
{
if(strD[i]>='0'&&strD[i]<='9')
flag=strD[i]-'0';
else
flag=strD[i]-'A'+10;
sum+=flag*k;
k*=16;
}
printf("%lld\n",sum);
}
return 0;
}
十六進制轉換成二進制,倒序轉換,連除四次,取餘。
代碼如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char strD[100000+11];
int strB[400000+11];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",strD);
int len1 = strlen(strD);
if(len1 == 1 && strD[0] == '0'){
printf("0\n");
continue;
}
int sign = 1;
int flag;
for(int i = len1-1 ;i>=0;i--){
if(strD[i]<='9') flag = strD[i]-'0';
else flag = strD[i]-'A'+ 10;
strB[sign++] = (flag%2);
flag>>=1;
strB[sign++] = (flag%2);
flag>>=1;
strB[sign++] = (flag%2);
flag>>=1;
strB[sign++] = (flag%2);
flag>>=1;
}
sign--;
sign = 3-sign%3+sign;
while(strB[sign]*4+strB[sign-1]*2+strB[sign-2] == 0) sign-=3;
for(int i = sign;i>0;i-=3){
printf("%d",strB[i]*4+strB[i-1]*2+strB[i-2]);
}
printf("\n");
}
return 0;
}