八进制转换成十六进制:
先将八进制转换为二进制。一个八进制位对应三个二进制位,再将二进制转换为十六进制,四个二进制位对应一个十六进制位。
代码如下:
#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;
}