1.倒序取余法
#include <stdio.h>
#include <string.h>
#define N 1000
void print_result(int *num, int count)
{
int i;
for(i=count-1; i>=0; --i)
{
printf("%d", num[i]);
}
printf("\n");
}
void convert(int *integer, int len, int *num, int *count, int m, int n)
{
int i;
int mod, tmp;
int tag = 1;
*count = 0;
while(tag != 0)
{
mod = 0;
tag = 0;
for(i=0; i<len; ++i)
{
if(integer[i] != 0)
{
tag = 1;
}
tmp = mod*m + integer[i];
integer[i] = tmp / n;
mod = tmp % n;
}
if(tag != 0)
{
num[(*count)++] = mod;
}
}
}
int main(void)
{
char str[N];
int integer[N];
int num[4000];
while (scanf("%s", str) != EOF)
{
int len;
int count;
if(0 == strcmp(str, "0"))
{
printf("0\n");
}
else
{
for(len=0; str[len]!='\0'; ++len)
{
integer[len] = str[len] - '0';
}
convert(integer, len, num, &count, 10, 2);
//print_result(num, count);
convert(num, count, integer, &len, 2, 10);
print_result(integer, len);
}
}
return 0;
}
2.倒序取余法
#include <stdio.h>
#include <string.h>
#define N 31
void printResult(int *result, int count)
{
int i;
for (i=count-1; i>=0; --i)
{
printf("%d", result[i]);
}
printf("\n");
}
void convert(int *integer, int n, int *result, int *count)
{
int i, mod, tmp, isContinue;
while (1)
{
mod = 0;
isContinue = 0;
/*计算每一次取余的结果*/
for (i=0; i<n; ++i)
{
if (integer[i] != 0)
{
isContinue = 1; /*存在不为0的位数,置标志为1*/
}
tmp = integer[i] + (mod * 10);
integer[i] = tmp / 2;
mod = tmp % 2;
}
if (isContinue != 0)
{
result[(*count)++] = mod;
}
else
{
break; /*每次取余后结果不为0时,继续*/
}
}
}
int main(void)
{
char str[N];
while (scanf("%s", str) != EOF)
{
int i, integer[N], result[110];
int count = 0;
if (0 == strcmp(str, "0"))
{
printf("0\n");
}
else
{
for (i=0; str[i]!='\0'; ++i)
{
integer[i] = str[i] - '0';
}
convert(integer, i, result, &count);
printResult(result, count);
}
}
return 0;
}