进制转换模板(必考!)

目录

目录

1,十进制转n进制

2,n进制转十进制

3,n进制转m进制

4,整形和string类的互换

5,模板

6,头文件

祝大家新年快乐!



1,十进制转n进制

        十进制转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|               ······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;
}

2,n进制转十进制

        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;
}

3,n进制转m进制

        在这里采用笨方法,就是先把n进制转为十进制,再转m进制。

string n_to_m(int n,int m,string num){//n进 -> m进 
	return to_n(m,to_10(n,num));
}

4,整形和string类的互换

        因为有些进制可能会出现字母。所以储存转化为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<

5,模板

需包含头文件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));
}

6,头文件

//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

祝大家新年快乐!

你可能感兴趣的:(c++)