数的进制转换
两个进制之间的直接转换
与十进制相关转换
题目链接
Describe:
编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。
这里有 62 个不同数位 {0−9,A−Z,a−z}。
输入格式
第一行输入一个整数,代表接下来的行数。
接下来每一行都包含三个数字,首先是输入进制(十进制表示),然后是输出进制(十进制表示),最后是用输入进制表示的输入数字,数字之间用空格隔开。
输入进制和输出进制都在 2 到 62 的范围之内。
(在十进制下)A=10,B=11,…,Z=35,a=36,b=37,…,z=61 (0−9 仍然表示 0−9)。
输出格式
对于每一组进制转换,程序的输出都由三行构成。
第一行包含两个数字,首先是输入进制(十进制表示),然后是用输入进制表示的输入数字。
第二行包含两个数字,首先是输出进制(十进制表示),然后是用输出进制表示的输入数字。
第三行为空白行。
同一行内数字用空格隔开。
输入样例:
8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030
输出样例:
62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001
10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A
35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05
23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj
49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S
61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030
5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890
题解:假设把这样一个数x.x.x从a进制转到b进制。
对a进制x的每一次运算的余数就是对x每一次运算的b进制的一个末位,下图展示一次运算的过程(获取b进制个位的过程)。
举个例子123从四进制转化为五进制
有一些细节不多说了,代码如下:
#include <algorithm>
#include <cstring>
#include <iostream>
#include<vector>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int a,b;
string a_l,b_l;
cin>>a>>b>>a_l;
vector<int> number;
for(auto c:a_l)
{
if(c>='0'&&c<='9') number.push_back(c-'0');
if(c>='A'&&c<='Z') number.push_back(c-'A'+10);
if(c>='a'&&c<='z') number.push_back(c-'a'+36);
}
reverse(number.begin(),number.end());//倒一下消除最高位的那个0
vector<int> res; //比如 123 例子中 011 的那个0
while(number.size())
{
int r=0;//余数
for(int i=number.size()-1;i>=0;i--)
{
number[i]+=r*a;
r=number[i]%b;//r作用于下一次操作*进制(上一行)
number[i]/=b;
}
res.push_back(r);
while(number.size()&&number.back()==0) number.pop_back();//这就体现最开始那个reverse的作用了,去掉一开始那个0
}
reverse(res.begin(),res.end());
for(auto x:res)
{
if(x<=9) b_l+=char(x+'0');
if(x>=10&&x<=35) b_l+=char(x-10+'A');
if(x>=36) b_l+=char(x-36+'a');
}
cout<<a<<" "<<a_l<<endl;
cout<<b<<" "<<b_l<<endl;
cout<<endl;
}
return 0;
}
n的二进制表示中的第K位是几
比如我们看n=10,这个数在二进制中的每一位的表达。
#include<iostream>
using namespace std;
int main()
{
int n=10;
for(int k=3;k>=0;k--)
cout<<(n>>k&1);
return 0;
}
二进制中1的个数
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
#include<iostream>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int x;
cin>>x;
int res=0;
while(x) x-=lowbit(x),res++;//直到x全部为0
cout<<res<<" ";
}
cout<<endl;
}