将十进制转为二进制,我们一般使用除二取余法,将余数从下往上组合起来,就能得到该数的二进制形式了:
对大数也是一样,我们只需要用循环重复这一过程即可。
使用string来存大数,用int型数组num[]存一位一位的大数,用int型数组ans[]存最终的二进制结果。从大数的第一位开始循环除以2,结果继续存到num[]中,直到num每一位都是0,运算就结束了。
下面放代码:
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int num[105];//大数
int ans[1000];//存放二进制结果
void get_ans(string big) {
for (int i = 0; i < big.length(); ++i)
num[i] = big[i] - '0';
bool flag = true;//判断大数本身是不是0
int k = 0;
for (int i = 0; i < big.length(); ++i) {
if (num[i]) flag = false;
}
if (flag) {//大数本身是0
cout << 0 << endl;
return;
}
int sum = 1;//赋一个初值,开始循环
while (sum) {
sum = 0;
for (int i = 0; i < big.length(); ++i) {
sum += num[i] / 2;//当num所有位都变成0,运算结束
if (i != big.length() - 1) {
num[i + 1] += (num[i] % 2) * 10;//可以参照上面的图片理解
}
else//运算到最后一位,一次除法完毕,存余数
ans[k++] = num[i] % 2;
num[i] /= 2;
}
}
int judge = 0;//不输出第一个‘0’
for (int i = 1000; i >= 0; --i) {//余数从下往上组合,所以从后往前输出
if (!judge&&ans[i]==0) {
judge = 1;
continue;
}
if (ans[i] != -1)
cout << ans[i];
}
cout << endl;
}
int main() {
memset(ans, -1, sizeof(ans));
memset(num, 0, sizeof(num));
string big;
cin >> big;
get_ans(big);
return 0;
}
其实,很多有关大数的运算(求模、四则运算),我们都可以采用这种思路,用int数组存每一位数,然后逐位运算,画个图之后思路就很清晰了。