c++ 进制转换

来源:互联网 发布:vscode 调试ts 编辑:程序博客网 时间:2024/06/04 18:17
// SistemaChange.cpp

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <math.h>


//M进制转N进制(16进制以内互相转换)


//翻转int
int convert(int num) {   
    int result = 0;            
    if(num == 0) {   
        return result;   
    }     
    int sign = num/abs(num);   
    num *= sign;          
    while(num > 0) {   
        int i = num % 10;   
        num = num / 10;   
        result = result * 10 + i;        
    }   
    return result * sign;   



//A问题分解
//1.1
// 2#1011 = 1*2^0+1*2^0+1*2^2+1*2^3=11
//2进制转10进制(整数)
int TwoToTen(int s2){
int s10=0;
int weight=0;
int tmpS2=s2;
int r=0;
while(tmpS2>0){
r=tmpS2 %10;//最后一位
s10+=r*pow(2,weight);
tmpS2/=10;
weight+=1;
}
return s10;
}


//1.2
//K进制转10进制
int KToTen(int sk,int k){
int s10=0;
int weight=0;
int tmpSk=sk;
int r=0;
while(tmpSk>0){
r=tmpSk %10;//最后一位
s10+=r*pow(k,weight);
tmpSk/=10;
weight+=1;
}
return s10;
}


//2.1
//10进制转2进制
//思路:倒除
//10#13-->8+4+1 = 1011
//13/2=6 余 1
//6/2=3  余 0
//3/2=1  余 1
//1/2=0  余 1
//逆序输出
int TenToTwo(int s10){
bool flag=0;
int s2=0;
int weight=0;
int tmpS10=s10;
int p=0;//商值
int r=tmpS10%2;//余数
if(r==0){flag=1;}
while(tmpS10>0){
p=tmpS10/2;
r=tmpS10%2;
s2+=r*pow(10,weight);
tmpS10=p;
weight+=1;
}


if(!flag){
return s2;
}else{
return 10*s2;
}
}




//2.2
//10进制转k进制
int TenToK(int s10,int k){
bool flag=0;
int sk=0;
int weight=0;
int tmpS10=s10;
int p=0;//商值
int r=tmpS10%k;//余数
if(r==0){//第一个余数为0
flag=1;
}


while(tmpS10>0){
p=tmpS10/k;
r=tmpS10%k;
sk+=r*pow(10,weight);
tmpS10=p;
weight+=1;
}
//最高位是0   例如10#3-->3#10   先得到的是01
if(!flag){
return sk;
}else{
return 10*sk;
}
}


//最终K进制转M进制
//最简单:k->10->m
int KToMSimple(int sk,int k, int m){
int s10=KToTen(sk,k);
int sm=TenToK(s10,m);
return sm;
}








int main(int argc, char* argv[])
{
// printf("Hello World!\n");
//测试2->10
cout<<"2#1011-->10#"<<TwoToTen(1011)<<"\n";//11
    cout<<"2#11011-->10#"<<TwoToTen(11011)<<"\n";//27


//测试2->10
cout<<"k2#1011-->10#"<<KToTen(1011,2)<<"\n";//11
    cout<<"k2#11011-->10#"<<KToTen(11011,2)<<"\n";//27

//测试3->10
cout<<"k3#11-->10#"<<KToTen(11,3)<<"\n";//4
cout<<"k3#11-->10#"<<KToTen(101,3)<<"\n";//10
    cout<<"k3#11011-->10#"<<KToTen(11011,3)<<"\n";//112
cout<<"k3#201-->10#"<<KToTen(201,3)<<"\n";//112

//测试10->2
cout<<"10#13-->2#"<<TenToTwo(13)<<"\n";//1011
cout<<"10#15-->2#"<<TenToTwo(15)<<"\n";//1111


//测试10->2
cout<<"10#13-->2#"<<TenToK(13,2)<<"\n";//1011
cout<<"10#15-->2#"<<TenToK(15,2)<<"\n";//1111


//测试10->3
cout<<"10#13-->3#"<<TenToK(3,3)<<"\n";//10
cout<<"10#13-->3#"<<TenToK(4,3)<<"\n";//11
cout<<"10#15-->3#"<<TenToK(10,3)<<"\n";//101


//测试k->m
cout<<"2#1011-->3#"<<KToMSimple(1011,2,3)<<"\n";//10:11 3:102  2+1*3^2=11
    cout<<"2#1101-->3#"<<KToMSimple(1101,2,3)<<"\n";//10:13 3:111  1+1*3^1+1*3^2=13


cout<<"9#312-->4#"<<KToMSimple(312,9,4)<<"\n";//10:11 3:102  2+1*3^2=11
cout<<"9#312-->10#"<<KToTen(312,9)<<"\n";//10:11 3:102  2+1*3^2=11
cout<<"9#254-->4#"<<TenToK(KToTen(254,9),4)<<"\n";//10:11 3:102  2+1*3^2=11
  


return 0;

}