【基础算法】进制转换专题
M进制转N进制
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int main()
{
int a, b;
string s;
cin >> a >> b >> s;
vector<int> A;
for(int i = s.size() - 1; i >= 0; i -- ) //高精度一般倒着存,方便去掉末尾(高位)零
if(s[i] >= 'A') A.push_back(s[i] - 'A' + 10); //如果s[i]=A,则存11,为B,存12,依次类推
else A.push_back(s[i] - '0');
string res;
if(res == "0") res = "0";
else
{
/*
直接将m进制转为n进制,但是在过程中会有一步转为10进制计算
*/
while(A.size()) //短除法,若A不为0
{
int r = 0;
for(int i = A.size() - 1; i >= 0; i -- )
{
A[i] += r * a; //将a进制的数转为10进制算
r = A[i] % b; //余数,A[i]此时是a进制的数转为10进制的结果,模b进制
A[i] /= b; //商
}
while(A.size() && A.back() == 0) A.pop_back();
if(r < 10) res += to_string(r);
else res += r - 10 + 'a'; //如果r=10,则输出a,是11,输出b,依次类推
}
reverse(res.begin(), res.end()); //余数是从上往下存的,要反转一下才是最终结果
}
cout << res << endl;
return 0;
}
作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/2478471/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
十进制转B进制
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char get(int x) // 将x转化为b进制
{
if(x <= 9) return x + '0';
return x - 10 + 'A';
}
string base(int n, int b) // n 在 b 进制下的表示
{
string num;
while(n) num += get(n % b), n /= b;
reverse(num.begin(), num.end());
return num;
}
bool check(string num)
{
for(int i = 0, j = num.size() - 1; i < j; i ++, j -- )
if(num[i] != num[j])
return false;
return true;
}
int main()
{
int b;
cin >> b;
for(int i = 1; i <= 300; i ++ )
{
string num = base(i * i, b);
if(check(num))
cout << base(i, b) << ' ' << num << endl;
}
return 0;
}
十进制转二进制
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
vector<int> div(vector<int> A, int b)
{
vector<int> C;
for(int i = A.size() - 1, r = 0; i >= 0; i -- )
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end()); // 高精度都倒着存,方便去掉末尾(高位)的零
while(C.size() && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string s;
while(cin >> s)
{
vector<int> A;
//正着输入
// for(int i = 0; i < s.size(); i ++ )
// A.push_back(s[s.size() - i - 1] - '0');
for(int i = s.size() - 1; i >= 0; i -- ) // 倒着输入
A.push_back(s[i] - '0');
string res;
if(s == "0") res = "0";
else
{
while(A.size())
{
res += to_string(A[0] % 2);
A = div(A, 2);
}
}
reverse(res.begin(), res.end()); //存余数的时候是从上面开始存的,而二进制数是从下往上数,要反转一下
cout << res << endl;
}
return 0;
}
作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/2478234/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
十进制转二进制+二进制逆序转十进制(高精度)
写法一(除法写了余数,即标准高精度除法模板)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
vector<int> div(vector<int>& A, int b, int &r)
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i -- )
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while (C.size() && C.back() == 0) C.pop_back();
return C;
}
vector<int> mul(vector<int>& A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
vector<int> add(vector<int>& A, int b)
{
vector<int> C;
int t = b;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(1);
return C;
}
void print(vector<int>& A)
{
for (int i = A.size() - 1; i >= 0; i -- )
cout << A[i];
cout << endl;
}
int main()
{
string s;
cin >> s;
vector<int> A;
for (int i = s.size() - 1; i >= 0; i -- )
A.push_back(s[i] - '0');
vector<int> B;
while (A.size())
{
int r;
A = div(A, 2, r);
B.push_back(r);
}
vector<int> C; // vector默认为0,与int不同,int未赋初值是随机数
for (auto c: B) // 秦九韶算法求二进制转十进制
{
C = mul(C, 2);
C = add(C, c);
}
print(C);
return 0;
}
作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/6356956/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
写法二:除法没写余数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
vector<int> div(vector<int>& A, int b)
{
vector<int> C;
int r = 0;
for (int i = A.size() - 1; i >= 0; i -- )
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while (C.size() && C.back() == 0) C.pop_back();
return C;
}
vector<int> mul(vector<int>& A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
vector<int> add(vector<int>& A, int b)
{
vector<int> C;
int t = b;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(1);
return C;
}
void print(vector<int>& A)
{
for (int i = A.size() - 1; i >= 0; i -- )
cout << A[i];
cout << endl;
}
int main()
{
string s;
cin >> s;
vector<int> A;
for (int i = s.size() - 1; i >= 0; i -- )
A.push_back(s[i] - '0');
vector<int> B;
while (A.size())
{
//int r;
B.push_back(A[0] % 2);
A = div(A, 2);
}
vector<int> C; // vector默认为0,与int不同,int未赋初值是随机数
for (auto c: B) // 秦九韶算法求二进制转十进制
{
C = mul(C, 2);
C = add(C, c);
}
print(C);
return 0;
}
作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/6356956/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
十六进制转十进制
写法一:正常写法
#include <iostream>
using namespace std;
int main()
{
string s;
while(cin >> s)
{
int sign = 1;
if(s[0] == '-')
{
sign = -1;
s = s.substr(3);
}
else s = s.substr(2);
int res = 0;
for(auto c : s)
{
int t = 0;
if(isupper(c)) t = c - 'A' + 10;
else if(islower(c)) t = c - 'a' + 10;
else t = c - '0';
res = res * 16 + t;
}
cout << res * sign << endl;
}
return 0;
}
写法二:cin可以直接读入十六进制的数
#include <iostream>
using namespace std;
int main()
{
int x;
while(cin >> hex >> x)
cout << x << endl;
return 0;
}
计算B进制的值(秦九韶算法)
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
LL get()
{
LL res = 0;
int n, b;
cin >> n >> b;
while (n -- )
{
int x;
cin >> x;
res = res * b + x; // 用res表示当前的值(同时也可表示上一位的值)
}
return res;
}
int main()
{
LL res1 = get(), res2 = get();
if (res1 > res2) cout << ">" << endl;
else if (res1 < res2) cout << "<" << endl;
else cout << "=" << endl;
return 0;
}
分类:
基础算法 / 进制转换
, 基础算法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程