进制转换--循环&&字符

八进制转换成十六进制:
先将八进制转换为二进制。一个八进制位对应三个二进制位,再将二进制转换为十六进制,四个二进制位对应一个十六进制位。
代码如下:

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值