十六进制快速转换八进制(算法核心可适用于2^n进制转化)

C++代码:
该算法就是在输入时候把2^4进制的数字转化为2进制, 之后开始截取2^3进制数字, 也就是每次截取3位数,再按照倍数转换为2^3进制, 输出即可

这个是百度百科中摘取的code, 大家千万要注意gets()和puts()的输入输出流, 对于刚刚入门C程序设计的同学, 千万记得gets()是不会读取’\n’,而是将’\n’存进输入流, 如果再跟一个getchar() 即可检验

编译环境: Sublime 2 + MinGW

#include<stdio.h>
#include<string.h>
#include<math.h>
#include <iostream>
using namespace std;

#define MAXsize 100000

void savebin(char *b,char *ch,int index)
{ 
    b[index]=ch[0];  b[++index]=ch[1];  b[++index]=ch[2];  b[++index]=ch[3]; 
}   

void hextobin(char *h,char *b)
{  
    char t[16][5]=  
    { 
      "0000","0001","0010","0011","0100","0101","0110","0111",   "1000","1001","1010","1011","1100","1101","1110","1111"
    };  
    int i = 0;  
    for(;h[i]!='\0';i++) 
    {  
        switch(h[i])   
        {  
        case '0':{
            savebin(b,t[0],i*4);
            break;
        }    
        case '1':
        {
            savebin(b,t[1],i*4);
            break;
        }   
        case '2':
        {
            savebin(b,t[2],i*4);
            break;
        }  
        case '3':
        {
            savebin(b,t[3],i*4);
            break;
        }    
        case '4':
        {
            savebin(b,t[4],i*4);
            break;
        }    
        case '5':
        {
            savebin(b,t[5],i*4);
            break;
        }  
        case '6':
        {
            savebin(b,t[6],i*4);
            break;
        }   
        case '7':
        {
            savebin(b,t[7],i*4);
            break;
        }   
        case '8':
        {
            savebin(b,t[8],i*4);
            break;
        }
        case '9':
        {
            savebin(b,t[9],i*4);
            break;
        }   
        case 'A':
        {
            savebin(b, t[10], i * 4);
            break;
        }
        case 'B':
        {
            savebin(b, t[11], i * 4); 
            break;
        }   
        case 'C':
        {
            savebin(b, t[12], i * 4); 
            break; 
        }    
        case 'D':
        {
            savebin(b, t[13], i * 4); 
            break; 
        }   
        case 'E':
        {
            savebin(b, t[14], i * 4); 
            break; 
        }   
        case 'F':
        {
            savebin(b, t[15], i * 4);
            break; 
        }
        }
    } 
    b[4 * i] = '\0';
}   
void bintooct(char *b, char *o)
{
    int i, j; 
    int bl, ol; 
    bl = strlen(b); 
    ol = ceil(bl / 3.0); 
    j = bl - 1;  
    i = ol - 1; 
    for(; i >= 0; --i, j -= 3)
    {  
        if(i > 0)  
        {    
            o[i]=b[j]+(b[j-1]-48)*2+(b[j-2]-48)*4; 
        }
        else 
        {  
            switch(j)  
            {  
            case 0:
            {o[i]=b[j];
                break;
            }

            case 1:{o[i]=b[j]+(b[j-1]-48)*2;
                break;
            }

            case 2:{o[i]=b[j]+(b[j-1]-48)*2+(b[j-2]-48)*4;
                break;
            }

            }  
        } 
    } 
    o[ol] = '\0'; 
}   
{ 
    int i = 0; 
while(o[i]=='0')
{  
 ++i; 
  } 
printf("%s\n",&o[i]);
}   

int main()
{ 
    char h[MAXsize]; 
    char b[MAXsize*4+1];
    char o[MAXsize*4/3+1];  
    int i,n; 

    cin >> n;
    getchar();
    for(i=0;i<n;i++) 
    {   
        gets(h);
        hextobin(h,b);  
        bintooct(b,o); 
        print(o); 
    }  return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值