进制转换
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int Atoi( string str , int N ){ //N进制转10进制,输入string 输出int
int ans = 0;
for( int i = 0 ; i < str.size() ; i++){
if(str[i] >= '0' && str[i] <= '9')
ans = ans * N + str[i] - '0';
else
ans = ans * N + str[i] - 'A' + 10;
}
return ans;
}
string Itoa( int num , int M ){ //10进制转M进制, 输入int ,输出string
string ans = "";
do{
int t = num % M;
if( t >= 0 && t <= 9 )
ans += t + '0';
else
ans += t - 10 + 'A';
num /= M;
}while( num != 0 );
reverse( ans.begin() , ans.end() );
return ans;
}
int main(){
int n , m;
string s1;
cin >> n >> s1 >> m;
int num1;
num1 = Atoi( s1 , n ); // 先把n进制转10进制
string s2;
s2 = Itoa( num1 , m ); //再将10进制转m进制
cout << s2 << endl;
return 0;
}
负数进制的进制转换
解题思路:
和正数差不多,但要注意将余数为负数的转化为正数,做法就是给商+1,余数-m (m为进制数,也就是除数),就是将原本的余数再拿出一部分
AC代码:
#include<bits/stdc++.h>
using namespace std;
string Itoa( int num , int m ){
string str = "";
do{
int t = num % m;
num /= m;
if( t < 0 ){
t -= m;
num += 1; //除数+1,余数-m
}
if( t >= 0 && t <= 9 )
str += t + '0';
else
str += t - 10 + 'A';
}while(num != 0);
reverse( str.begin() , str.end() );
return str;
}
int main(){
int n,m;
cin >> n >> m;
string s1;
s1 = Itoa( n , m );
cout << n << "=" << s1 << "(base" << m << ")" << endl;
return 0;
}