c++算法之进制转换

目录

将任意进制转换为十进制

将十进制转换为k进制

例题

蓝桥oj2489 进制

问题描述

蓝桥oj2095九进制转十进制

蓝桥oj1230进制转换

题目描述

输入描述

输出描述

输入样例

输出样例


将任意进制转换为十进制

ll x = 0;
for(int i = 1;i <= n;++ i)
{
    x = x*k + a[i];
}
cout<< x <<endl;

将十进制转换为k进制

ll x;cin>>x;
while(x)a[++cnt]=x%k,x/=k;
reverse(a+1,a+1+cnt);//反转使高位在1

例题

蓝桥oj2489 进制

问题描述

请问十六进制数 2021ABCD 对应的十进制是多少?

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
using ll = long long;
const int N = 50;
int a[N];
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	
	string s = "2021ABCD";
	for (int i = 0;i < s.length(); ++ i)
	{
		if ('0' <= s[i] && s[i] <= '9')a[i + 1] = s[i] - '0';
		else a[i + 1] = s[i] - 'A' + 10;
	}

	ll x = 0;
	for (int i = 1; i <= s.length(); ++i)
	{
		x = x * 16 + a[i];
	}
	cout << x << endl;
	return 0;
}

蓝桥oj2095九进制转十进制

九进制正整数 (2022)9转换成十进制等于多少?

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
using ll = long long;
const int N = 50;
int a[N];
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n = 4;
	string s = "2022";
	for (int i = 1; i <= 4; ++i)a[i] = s[i - 1] - '0';

	ll x = 0;
	for (int i = 1; i <= n; ++i)
	{
		x = x * 9 + a[i];
	}
	cout << x;

	return 0;
}

蓝桥oj1230进制转换

题目描述

给定一个 N 进制数 S,请你将它转换为 M 进制。

输入描述

第一行为一个整数T,表示测试数据数量。 (1≤T≤1051≤T≤105)

每个测试用例包含两行,第一行包含两个整数 N,M。

第二行输入一个字符串 S,表示 N 进制数。

数据范围保证:2≤N,M≤16,若 N≥10,则用 A∼F表示字码 10∼15。保证 S 对应的十进制数的位数不超过 10。

输出描述

输出共 T,每行表示一组数据的答案。

输入样例

2
2 10 
10101 
11 2
1793A5068

输出样例

21
10101111001010100111010101011

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll; int a[1000];
char ch[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
void solve()
{
	int n, m; cin >> n >> m;//n进制转换为m进制
	string s; cin >> s;
	for (int i = 0; i < s.length(); ++i)
	{
		if ('0' <= s[i] && s[i] <= '9')a[i+1] = s[i] - '0';
		else a[i+1] = s[i] - 'A' + 10;
	}
	ll x = 0;
	for (int i = 1; i <= s.length(); i++)
	{
		x = n * x + a[i];//s的十进制
	}

	string ans;
	while (x)
	{
		ans += ch[x % m];
		x /= m;
	}
	reverse(ans.begin(), ans.end());
	cout << ans << endl;

}

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	int t; cin >> t;
	while (t--)
	{
		solve();
	}

	return 0;
}

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是祁同伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值