大数进制转化

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;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值