进制转换
题型1:十进制转其他进制
题目:
https://www.acwing.com/problem/content/3376/
题目描述:
将一个长度最多为 30位数字的十进制非负整数转换为二进制数输出。
输入格式
输入包含多组测试数据。每组测试数据占一行,包含一个长度不超过 30位的十进制非负整数。
输出格式
每组数据输出一个结果,占一行,为输入对应的二进制数。
数据范围
输入最多包含 100组测试数据。
输入样例:
0
1
3
8
输出样例:
0
1
11
1000
题目分析:
包含一个长度不超过 30位的十进制非负整数——>使用高精度(用字符串存储)
其完整代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#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 -- ) //i = A.size()-1 ,A[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');//倒着存
string res;
if(s=="0")res ="0"; //判断特例
else
{
while (A.size())
{
res += to_string(A[0] % 2); //A[0]表示s数的个位数
A = div(A, 2); //除2
}
}
reverse(res.begin(),res.end());
cout<<res<<endl;
}
return 0;
}
代码举例分析:


浙公网安备 33010602011771号