常用函数的一些小总结
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进制换算总结
发布评论