目录
1,十进制转n进制
2,n进制转十进制
3,n进制转m进制
4,整形和string类的互换
5,模板
6,头文件
祝大家新年快乐!
十进制转n进制一般用“除n取余倒接法”。(最后一次求出有几个n,倒数第二次求出有几个n的平方,倒数第三次求出有多少个n的立方……)
例:把(40256)10 转化为2进制
2|40256
2|20128 ······0 /|\
2|10064 ······0 |
2|5032 ······0 |
2|2516 ······0 |
2|1258 ······0 |
2|629 ······0 |
2|314 ······1 | 接
2|157 ······0 |
2|78 ······1 | ======》1001110101000000
2|39 ······0 |
2|19 ······1 |
2|9 ······1 | 倒
2|4 ······1 |
2|2 ······0 |
2|1 ······0 |
0 ······1 |
所以(40256)10=(1001110101000000)2 (累死)
注意!大于等于10的数字要转化为大写字母,如10是A、11是B、12是C。
所以呢,我们可以这样写:
string to_n(int n,int num){//10进 -> n进
string s1,s2=" ";
while(num>0){
s2[0]=(num%n)>9?(char)((num%n)-10+'A'):(char)((num%n)+'0');
s1.insert(0,s2);//头插
num/=n;
}
return s1;
}
n进制转十进制一般用“位权乘值累加法”,位权就是每个数位在数中代表的值。
例:把(1001110101000000)2 转化为十进制
(9D40)16=9*16^3+D*16^2+4*16=9*4056+13*256+4*16=36504+3328+64=(40256)10
所以(9D40)16=(40256)10
所以呢,我们可以这样写:
int to_10(int n,string num){//n进 ->10进
int m=0,t;
for(int i=num.size()-1,t=1;i>=0;i--,t*=n)
m+=t*(n>=10&&num[i]>='A' ? num[i]-'A'+10 : num[i]-'0');
return m;
}
在这里采用笨方法,就是先把n进制转为十进制,再转m进制。
string n_to_m(int n,int m,string num){//n进 -> m进
return to_n(m,to_10(n,num));
}
因为有些进制可能会出现字母。所以储存转化为n进制的数的时候用的string。这里顺便讲一讲整型和string的互换。
string流可以提供一个缓冲区供数据写入写出,string流的代码如下:
#include
StringStream ss;//定义一个string流,叫ss。
ss.clear()//流清空
ss<>x>>x;//元素写出流
利用string流可以实现string与整型的转化:
string s;
StringStream ss;
int x;
ss.clear()
cin>>x;
ss<>s;
cout<>s;
ss<>x;
cout<
需包含头文件string。
int to_10(int n,string num){//n进 ->10进
int m=0,t;
for(int i=num.size()-1,t=1;i>=0;i--,t*=n)
m+=t*(n>=10&&num[i]>='A' ? num[i]-'A'+10 : num[i]-'0');
return m;
}
string to_n(int n,int num){//10进 -> n进
string s1,s2=" ";
while(num>0){
s2[0]=(num%n)>9?(char)((num%n)-10+'A'):(char)((num%n)+'0');
s1.insert(0,s2);
num/=n;
}
return s1;
}
string change(int n,int m,string num){//n进 -> m进
return to_n(m,to_10(n,num));
}
//Base conversion
//文件名:BaCon.h
#ifndef _BACON_
#define _BACON_
#include
#include
using namespace std;
typedef stringstream sstream;
int to_10(int n,string num){//n进 ->10进
int m=0,t;
for(int i=num.size()-1,t=1;i>=0;i--,t*=n)
m+=t*(n>=10&&num[i]>='A' ? num[i]-'A'+10 : num[i]-'0');
return m;
}
string to_n(int n,int num){//10进 -> n进
string s1,s2=" ";
while(num>0){
s2[0]=(num%n)>9?(char)((num%n)-10+'A'):(char)((num%n)+'0');
s1.insert(0,s2);
num/=n;
}
return s1;
}
string n_to_m(int n,int m,string num){//n进 -> m进
return to_n(m,to_10(n,num));
}
string to_string(int n){//int -> string
string s;
sstream ss;
ss.clear();
ss<>s;
return s;
}
int to_int(string s){//string -> int
int n;
sstream ss;
ss.clear();
ss<>n;
return n;
}
#endif