进制转换问题

位转换

16转8

//16转8 
#include <stdio.h>
#include <string.h>

char str[100005], num;
void Fun(int i, int state) //长度  位数 
{
    int temp;
    if(i < 0)
    {
        if(num != 0)  //此时的num转二进制后的有效位数小于三位,即num小于8
        {
            printf("%d", num);
        }
        return;
    }
    if(state != 3)
    {
        temp = str[i] >= '0' && str[i] <= '9' ? str[i] - '0' : str[i] - 'A' + 10;
        temp <<= state;  //state指每次将16进制转2进制后,截取最后三位后剩余几位
        num |= temp;     //把二进制的num和二进制的temp相加(等同于十进制之间的加,因为对应num位数的temp的后几位在上一步左移时填补了0)
        temp = num;
        num >>= 3;
        Fun(i - 1, state + 1);
        printf("%d", (temp & 1) + (temp & 2) + (temp & 4));  //相当于将temp转二进制后的最后三位取出并转8进制
    }
    else
    {
        temp = num;
        num >>= 3;
        Fun(i, 0);
        printf("%d", (temp & 1) + (temp & 2) + (temp & 4));
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    while(n--)
    {
        num = 0;
        scanf("%s", str); //输入 
        Fun((int)strlen(str) - 1, 0);
        printf("\n");
    }
    return 0;
}
View Code
10转2转16
//十进制转2进制 转16进制 
#include <stdio.h>
#include <string.h>
 
int inttoBin(unsigned int num)
{
    int i;
    unsigned int mask = 0x80000000;
    for(i = 0; i < 32; i++)
    {
        if((num & mask) == mask)
        {
            printf("1");
        }
        
        else
        {
            printf("0");
        }
        num = num << 1;
        
        if((i + 1) % 4 ==0)
        {
            printf(" ");
        }
    }
    
    printf("\n");
}
int inttoox(unsigned int num)
{
    int i;
    unsigned int temp = num;
    char s[11];
    memset(s,0,sizeof(char));
    
    s[0] = '0';
    s[1] = 'x';
    s[10] = '\0';
    unsigned int mask = 0x0000000f;
    for(i = 2; i < 10; i++)
    {
        if((temp & mask) > 10)
        {
            s[11-i] = (temp & mask) - 10 + 'a'; 
        }
        else
        {
            s[11-i] = (temp & mask) + '0';
        }
        
        temp = temp << 4;
    }
    
    printf("result = %s\n",s);
    //printf("result = %s\n",s);
}
int main()
{
    unsigned int num;
    char s[11];
    
    printf("intput a number\n");
    scanf("%u",&num);
    
    inttoBin(num);
    inttoox(num);
    return 0;
}
View Code

1.十进制转换成 d进制   <d<=16>  首选栈

//十进制转换成d进制   用堆解决 
#include<iostream>
#include<stack>
using namespace std;
void gcd(int n,int d){
    stack<int> s;
    int e;
    while(n!=0){
        e=n%d;
        s.push(e);
        n/=d;
    }
    while(!s.empty()){
        e=s.top();
        s.pop();
        cout<<e;
    }
    return ;
} 
int main()
{
    int num,d;
    while(cin>>num>>d){
        gcd(num,d);
    }
    
}
View Code

2.d进制转换成10进制  首选栈

#include<iostream>
#include<stack>
using namespace std;
stack<int> s;
int gcd(int d){
    int e=1,sum,tmp=1;
    e=s.top();
    s.pop();
    sum=e;
    while(!s.empty()){
        e=s.top();
        s.pop();
        tmp*=d;
        sum+=e*tmp;
    }
    return sum;
} 
int main()
{
    int d,e;
    string str;
    while(cin>>str>>d){
        int len=str.length();
        for (int i = s.size(); i > 0; --i) //自己清空栈 
        s.pop();
        cout<<s.size()<<endl;
        for(int i=0;i<len;i++) {
            e=str[i]-'0';
            s.push(e);
        }
        cout<<gcd(d)<<endl;
    }
}
View Code

3. 大数转换  2 8 16进制转换(使用容器map)   待续,,,

 

posted @ 2019-02-18 19:40  Hello_World2020  阅读(194)  评论(0编辑  收藏  举报