进制转换 首先关注是几进制(有没有可能>=10) 再关注数字的大小(十进制用long long是否存的下)
思路方面 可以运用的两个工具:十进制转M进制 M进制转十进制
十进制(数值类型)转二进制 ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2ec0ab207ef559a959fef57f8ecbec25.jpeg)
用一个vector L存二进制的每一位 考虑十进制数为0的情况
while(n!=0){
L.push_back(n%2);
n=n/2;
}
for(int i=L.size()-1;i>=0;i--){
cout<<L[i];
}
if(L.empty()) cout<<"0";//!!!!!!!!!!!!!!!!
数字超过存储范围时:十进制(string)转二进制 二进制(string)转十进制 。 涉及 <string类型数字串,int型数字> 的加·乘·除,所得结果是数字串!
十进制(string)转二进制 涉及string类型除法
key1:字符串除法的实现:和手算一样,被除数每一位都用除数整除,然后余数×10后加到下一位上。最后要去0.
string Divide(string str,int x){
//除法
int remainer=0;//余数
for(int i=0;i<str.size();i++){
int current=remainer*10+str[i]-'0';
str[i]=current/x+'0'; //加‘0’不要漏掉
remainer=current%x;
}
//去除前面的0
int i=0;
while(str[i]=='0') i++;
str=str.substr(i);
return str;
}
key2:某个字符 转化为数字-‘0’; 数字转化为字符+‘0’! 容易漏掉!
#include<bits/stdc++.h>
using namespace std;
string Divide(string str,int x){
//除法
int remainer=0;//余数
for(int i=0;i<str.size();i++){
int current=remainer*10+str[i]-'0';
str[i]=current/x+'0'; //加‘0’不要漏掉
remainer=current%x;
}
//去除前面的0
int i=0;
while(str[i]=='0') i++;
str=str.substr(i);
return str;
}
int main(){
string str;
while(cin>>str){
vector<int> S;
while(!str.empty()){ //注意下终止条件
int last=(str[str.size()-1]-'0')%2;
S.push_back(last);
str=Divide(str,2);
}
for(int i=S.size()-1;i>=0;i--){
cout<<S[i];
}
cout<<endl;
}
}
十进制(string)转二进制+二进制转十进制(string) 涉及string类型除法 加法 乘法
key1:数字转换为字符串string 用to_string() 返回string。
key2:字符串乘法: string每一位都乘数字x+carry carry更新为乘积/10 最后前补进位
string Multiple(string str,int x){
int carry=0;
for(int i=str.size()-1;i>=0;i--){
int current=carry+x*(str[i]-'0');
str[i]=current%10+'0';
carry=current/10;
}
string m;
m=to_string(carry);
if(carry!=0) str=m+str;
return str;
}
key3:字符串加法:一开始carry就为x,string每一位都只加carry carry更新为乘积/10 最后前补进位
string Add(string str,int x){
int carry=x;
for(int i=str.size()-1;i>=0;i--){
int current=carry+str[i]-'0';
str[i]=current%10+'0';
carry=current/10;
}
string m;
m=to_string(carry);
if(carry!=0) str=m+str;
return str;
}
key4:如何实现:
string answer="0";
for(int i=0;i<S.size();i++){
answer=Multiple(answer,2);
answer=Add(answer,S[i]);
}
题解:
#include<bits/stdc++.h>
using namespace std;
string Divide(string str,int x){
//除法
int remainer=0;
for(int i=0;i<str.size();i++){
int current=remainer*10+str[i]-'0';
str[i]=current/x+'0';
remainer=current%x;
}
//去除前面的0
int i=0;
while(str[i]=='0') i++;
str=str.substr(i);
return str;
}
string Add(string str,int x){
int carry=x;
for(int i=str.size()-1;i>=0;i--){
int current=carry+str[i]-'0';
str[i]=current%10+'0';
carry=current/10;
}
string m;
m=to_string(carry);
if(carry!=0) str=m+str;
return str;
}
string Multiple(string str,int x){
int carry=0;
for(int i=str.size()-1;i>=0;i--){
int current=carry+x*(str[i]-'0');
str[i]=current%10+'0';
carry=current/10;
}
string m;
m=to_string(carry);
if(carry!=0) str=m+str;
return str;
}
int main(){
string str;
while(cin>>str){
vector<int> S;
while(!str.empty()){
int last=(str[str.size()-1]-'0')%2;
S.push_back(last);
str=Divide(str,2);
}
string answer="0";
for(int i=0;i<S.size();i++){
answer=Multiple(answer,2);
answer=Add(answer,S[i]);
}
cout<<answer;
}
}
M进制的处理:可以运用的两个工具:十进制转M进制 M进制转十进制
需要注意:进制大于10时 需要用字母表示!!要写IntToChar(char c)和CharToInt(char c)函数
转换成十进制的数用long long存
M进制转十进制 这个M进制数最好用string 十进制用long long
十进制转M进制 这个十进制用long long
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
using namespace std;
char IntToChar(int x){
if(x<10){
return x+'0';
}
else return x-10+'a';
}
char CharToInt(char c){
if(c>='0'&&c<='9'){
return c-'0';
}
else return c-'A'+10;
}
int main(){
vector<int> S;
int m,n; string str;
cin>>m>>n;
cin>>str;
//M进制转十进制
long long number=0;
for(int i=0;i<str.size();i++){
number*=m;
number+=CharToInt(str[i]);
}
//十进制转N进制
vector<char> answer;
while(number!=0){
answer.push_back(IntToChar(number%n));
number/=n;
}
for(int i=answer.size()-1;i>=0;i--){
cout<<answer[i];
}
cout<<endl;
}