进制转换
进制转换的本质
计算机中,数字均通过二进制补码表示
1)将任意进制转换为十进制
//将任意禁止转换为十进制
ll x = 0;
for (int i = 1; i <= n; ++i)
{
x = x * k + a[i];
}
cout << x << '\n';
//这个k进制的数组可以通过对字符串的处理得到
2)十进制转换为任意进制
x转换为k进制: 主要步骤是 x%k ,x/=k;
ll x; cin >> x;
while (x)
a[++cnt] = x % k, x /= k;
reverse(a + 1, a + 1 + cnt);//要反转一下,才能使得高位在1的位置
例题:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1000;
int a[N];
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;
string s; cin>> s;
int len=s.length();
s="a"+s;//为更好表示,用字母a占据第一位
for(int i=1;i<=len;++i)
{
if('0'<=s[i]&&s[i]<='9') a[i]=s[i]-'0';//得到一个数字9
else a[i]=s[i]-'A'+10;//证明a[i]是ABCDE的其中一位,也是转为9
}
ll x=0;
for(int i=1;i<=len;++i) x=x*n+a[i];//得到十进制的数字
string ans;
while(x)//转成m进制
{
ans+=ch[x%m];
x/=m;
}
reverse (ans.begin(),ans.end());
cout << ans<< '\n';
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin>> t;
while(t--)
solve();
return 0;
}
前缀和
prefix表示前缀和 ,前缀和由一个用户输入的数组生成。prefix[i]=a[j]数组的1到i的求和
//求数组的区间和,可以用前缀和实现
sum(l, r) = prefix[r] - prefix[l - 1];