您的位置:首页 > 编程语言 > C语言/C++

c++ 进制转换

2013-09-04 01:07 246 查看
// 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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: