基本思想是列竖式,每轮求出商和余数。
例如:
大数字符串是“1234”
第一次 “1234” / 2 = 0617 … 0
在本文例子中,首先将大数最高位字符 '1' 转换成整数转换成整数 1
然后计算 1 / 2 = 0, 再把 0 转换成字符 '0' 放到缓存区中,这是得到商
的最高位。计算次高位 '2' 时,由于前一位 1 % 2 = 1,此时会有借位
发生,也就是 (1*10 + 2) / 2 = 6,作为商的次高位,剩下位的计算和前面的
一样。
第二次 “0617” / 2 = 0308 … 1
第三次 “0308” / 2 = 0154 … 0
第三次 “0154” / 2 = 0077 … 0
第四次 “0077” / 2 = 0038 … 1
第五次 “0038” / 2 = 0019 … 0
第六次 “0019” / 2 = 0009 … 1
第七次 “0009” / 2 = 0004 … 1
第八次 “0004” / 2 = 0002 … 0
第九次 “0002” / 2 = 0001 … 0
第十次 “0001” / 2 = 0000 … 1
到最后商为0是结束,余数倒过来输出即可得到对应的二进制数"10011010010",
在具体实现的时候值得关注的问题是借位,判断结束的条件。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#define BIGNUMLEN 1024
// reverse a string
void reverse(char *num)
{
int i, j, len;
len = strlen(num);
j = len - 1;
for (i = 0; i < len / 2; i++)
{
// exchange num[i] and num[j]
num[i] = num[i] ^ num[j];