基础算法-2.22

进制转换

进制转换的本质

计算机中,数字均通过二进制补码表示

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];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值