基础练习 十六进制转八进制

基础练习 十六进制转八进制  
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

   【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

   提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

解题思路:利用十六进制和二进制以及二进制和八进制的关系,将二进制作为一个桥梁,先将十六进制转化成二进制,然后再转化成八进制,就可以了;

值得注意的是当转化成二进制时,如果用字符串拼接函数是会运行超时的,所以要用string。。


超时代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=100001;
char s[maxn],c[maxn*4];
int b[maxn*2];
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",s);
        int l=strlen(s);
        memset(c,0,sizeof(0));
        for(int i=0; i<l; i++)//转化成二进制
        {
            if(s[i]=='0') strcat(c,"0000");
            else if(s[i]=='1') strcat(c,"0001");
            else if(s[i]=='2') strcat(c,"0010");
            else if(s[i]=='3') strcat(c,"0011");
            else if(s[i]=='4') strcat(c,"0100");
            else if(s[i]=='5') strcat(c,"0101");
            else if(s[i]=='6') strcat(c,"0110");
            else if(s[i]=='7') strcat(c,"0111");
            else if(s[i]=='8') strcat(c,"1000");
            else if(s[i]=='9') strcat(c,"1001");
            else if(s[i]=='A') strcat(c,"1010");
            else if(s[i]=='B') strcat(c,"1011");
            else if(s[i]=='C') strcat(c,"1100");
            else if(s[i]=='D') strcat(c,"1101");
            else if(s[i]=='E') strcat(c,"1110");
            else if(s[i]=='F') strcat(c,"1111");
        }
        int l1=strlen(c);
        int t=l1%3,j=0;
        if(t==1) b[j++]=c[0]-'0';
        else if(t==2) b[j++]=(c[0]-'0')*2+(c[1]-'0');
        for(int i=t; i<l1; i=i+3)
            b[j++]=(c[i]-'0')*4+(c[i+1]-'0')*2+(c[i+2]-'0');
        int g;
        for(g=0; g<j; g++)
            if(b[g]!=0) break;
        for(int h=g;h<j;h++)
            printf("%d",b[h]);
        printf("\n");

    }
    return 0;
}

正确代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=100005;
char s[maxn];
int f(char s)
{
    return s-'0';
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        string s1="";
        scanf("%s",s);
        int l=strlen(s);
        for(int i=0; i<l; i++)//转化成二进制
        {
            if(s[i]=='0') s1+="0000";
            else if(s[i]=='1') s1+="0001";
            else if(s[i]=='2') s1+="0010";
            else if(s[i]=='3') s1+="0011";
            else if(s[i]=='4') s1+="0100";
            else if(s[i]=='5') s1+="0101";
            else if(s[i]=='6') s1+="0110";
            else if(s[i]=='7') s1+="0111";
            else if(s[i]=='8') s1+="1000";
            else if(s[i]=='9') s1+="1001";
            else if(s[i]=='A') s1+="1010";
            else if(s[i]=='B') s1+="1011";
            else if(s[i]=='C') s1+="1100";
            else if(s[i]=='D') s1+="1101";
            else if(s[i]=='E') s1+="1110";
            else if(s[i]=='F') s1+="1111";
        }
        int ll=s1.length();
        if(ll%3 == 1) s1 = "00" + s1;//若长度不是3的倍数,则加上相应个数的‘0’
        else if(ll%3 == 2) s1 = "0" + s1;
        ll=s1.length();
        //cout<<s1<<ll<<endl;
        for(int g=0; g<ll-2; g+=3){//每三位二进制相当于一位八进制
            int num = f(s1[g])*4 + f(s1[g+1])*2 + f(s1[g+2]);
            if(!g && !num) continue;
            printf("%d", num);
        }
        printf("\n");
    }
    return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值