常用函数的一些小总结

string to int(字符串转到int类型)

#include<sstream>    //重要的库
#include<iostream>
#include<string>

using namespace std;

int str2int(string str){
    stringstream ss;
    int value;
    ss<<str;	//将字符串传到ss流中
    ss>>value;	//将 流 传到int类型的value中
    ss.clear();
    return value;
}

int to string(int转换到string)

原理是一样的,都是ss流来转换,只不过反过来而已

string int2str(int value){
    stringstream ss;
    string str;
    ss<<value;
    ss>>str;
    ss.clear();
    return str;
}

关于进制换算

比如16进制、10进制、8进制到8进制、10进制,我认为都可以通过转成2进制来转换。

进制换算目前我总结起来,有两大类,第一类有两种方法(倒余除法、位权值法),第二类只有一种方法(一 一对应法)。

第一类 10进制的转换和被转换(不讨论小数部分)(n进制 to 10或者10 to n进制)

1.倒余除法 用于10进制到n进制

10->16
10->8
10->2

例如
10进制下的数值28 转成 8进制

【商,余数】=(被除数,除数)
【3,4】=(28,8)
【0,3】=(3,8)

得到余数 4 、3 ,将余数的序列倒过来就变成了8进制的转化结果34。

2.位权值法 用于n进制到10进制

(所有方法的名字我是随便想的,别介意)

如:
16->10
8->10
2->10
就是用他们的数码*原来进制的位权之和(通俗的理解就是,该数字所在的位置的权重)

比如 10进制的523->10进制
523 = 5X100+2X10+3X1(其中5、2、3称为数码,100、 10 、1 称为位权)=523

比如 16进制的C35 ->10进制

C35 = C X 16的2次方+3 X 16的1次方 + 5 X 16的0次方 = …(自己计算)

第二类 n进制 to 2 或者 2 to n进制(n不包括10)

方法: 一一对应

1.

16进制、8进制 —> 2进制

n进制 可以用 k位2进制数来表示
16进制 可以用 4位2进制来表示
8进制 可以用 3位2进制数来表示

我们以16进制为例
C59(16进制) =???(2进制)


C对应的二进制是1100
5对应的二进制是0101
9对应的二进制是1001
顺序组合下来就是答案110001011001

8进制转2进制类似,就是将每一位数字表示为对应的二进制数字串,然后顺序组合起来。

2.

2进制—> 8进制、 16 进制
方法就是第1.倒过来

举例:
(2进制) 110001011001 = ???(8进制)



如果2进制数字串划分为几个3位(8进制)或者4位(16进制)的小组不够长度,就需要在最开始的前面补一个0或者两个0,直到补够为长度是3的倍数为止。

蓝桥杯题目 十六进制转八进制

思路

先将十六进制(Hexadecimal)转为二进制(Binary)
再讲二进制转到八进制(Octal)

于是,先用一 一对应法将16转换为2进制,再用一 一对应发由2进制到8进制。

#include<iostream>
#include<string>  //字符串
#include<cctype>
#include<algorithm> 
#include<tgmath.h>
#include<sstream>

using namespace std;

//蓝桥杯好像不允许str。to_string()通过,所以换个方法
string toString(int value){
	string str;
	stringstream ss;
	ss << value;
	ss >> str;
	ss.clear();  //清楚这个流中残留的数据
	return str;
}


string hexaToBina(string hexa){
	string bina;
	for(int i=0;i<hexa.length();i++){
		char a= hexa[i];
		
		//10-15 A-F 
		if(a>='A'&&a<='F'){
			int e = static_cast<int>(a-'A'+10);
			switch(e){
				case 10:bina+="1010";break;
				case 11:bina+="1011";break;
				case 12:bina+="1100";break;
				case 13:bina+="1101";break;
				case 14:bina+="1110";break;
				case 15:bina+="1111";break;
				default:break;
				
			}
		}
		
		//0-9
		else{
			int e=static_cast<int>(a-'0');
			switch(e){
				case 0:bina+="0000";break;
				case 1:bina+="0001";break;
				case 2:bina+="0010";break;
				case 3:bina+="0011";break;
				case 4:bina+="0100";break;
				case 5:bina+="0101";break;
				case 6:bina+="0110";break;
				case 7:bina+="0111";break;
				case 8:bina+="1000";break;
				case 9:bina+="1001";break;
				default:break;
			}
		}	
	}
	return bina;
}


string binaToOct(string bina){
	string octDig="";
	//填充0 ,倒过来好操作
	reverse(bina.begin(),bina.end());
	switch(bina.length()%3){
		case 0:break;
		case 1:bina+="00";break;
		case 2:bina+="0";break;
		default:break;
	}
	reverse(bina.begin(),bina.end());
	//0填充完成
	for(int i=0,start=0;i<bina.length()/3;i++){		
		string temp=bina.substr(start,3); //拿来计算每个分组对应的值,每个分组是3位二进制数,比如110 
		int result=0;
		if((temp=="000")&&i==0)
		{
			start+=3;
			continue;
		}
		else{
			for(int j=0;j<=2;j++){
				int k=static_cast<int>(temp[j]-'0');
				result += k*pow(2,2-j);
			}
			octDig+=toString(result);
		}

		start+=3;
	}
	return octDig;
}

int main(void)
{
	int n;
	cin>>n;
	
	for(int i=0;i<n;i++){
		string b;
		cin>>b;
		b = hexaToBina(b);		
		string c = binaToOct(b);
		cout<<c<<endl;
	}
	return 0;
}

16进制到10进制

## 思路

直接位权值法

#include<iostream>
#include<tgmath.h>
#include<string>
#include<sstream>
using namespace std;

string tostr(int value){
	string str;
	stringstream ss;
	ss<<value;
	ss>>str;
	ss.clear();
	return str;
	
}


int main(){
	string a;
	string dec="";
	cin>>a;
	int len=a.length();
	
	int result;
	for(int i=0;i<len;i++){
		if(a[i]>='A'&&a[i]<='F'){
			int e = static_cast<int>(a[i]-'A'+10);//10 11 12 13 14 15
			result+= e*pow(16,len-1-i);
		}
		else{
			int e = static_cast<int>(a[i]-'0');
			result+= e*pow(16,len-1-i);
		}
	}
	dec = tostr(result);
	cout<<dec<<endl;
	return 0;	
}

10进制到16进制

思路
倒余除法

#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>

using namespace std;

int str2int(string s)
 {   
    int num;
    stringstream ss(s);
    // ss<<s;
    ss>>num;
    ss.clear();
    return num;
}

string int2str(int value){
    stringstream ss;
    string str;
    ss<<value;
    ss>>str;
    ss.clear();
    return str;
}

string decToHexa(string a){
    long long int value = str2int(a);
    string hexa;

    long long int remainder;
    long long int quotient=value;
    int flag=0;
    while(quotient!=0){
        flag =1 ;
        remainder= quotient%16;
        quotient = quotient/16;
        if(remainder>=0&&remainder<=9){
            hexa+=int2str(remainder);
        }
        else{
            switch (remainder)
            {
            case 10:hexa+="A";break;
            case 11:hexa+="B";break;
            case 12:hexa+="C";break;
            case 13:hexa+="D";break;
            case 14:hexa+="E";break;
            case 15:hexa+="F";break;
            default:break;
            }
        }
    }
    if(flag==0) return "0";
    reverse(hexa.begin(),hexa.end());
    return hexa;
}


int main(){
    string a;
    cin>>a;
    string b;
    b = decToHexa(a);
    cout<<b;
    return 0;
}

更多推荐

蓝桥杯基础之16进制、10进制、8进制、2进制换算总结