较大整数的数制转换

本文介绍了一种使用C语言实现的大数运算方法,包括加法、乘法、除法和取余操作。通过定义结构体和重载运算符,实现了大数与整数之间的基本算术运算,并展示了如何将大数从一种进制转换到另一种进制的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<string.h>
struct bignum
{
	int digit[1000];
	int size;
	void init()
	{
		size = 0;
		for (int i = 0; i < 1000; i++)
			digit[i] = 0;
	}
	void set(int x)
	{
		init();
		do
		{
			digit[size++] = x % 100;
			x = x / 100;
		} while (x != 0);
	}
	void output()
	{
		for (int i = size - 1; i >= 0; i--)
		{
			if (i = size - 1)
				printf("%d", digit[i]);
			else
				printf("%02d", digit[i]);
		}
		printf("\n");
	}
	bignum operator * (int x) const
	{
		bignum c;
		c.init();
		int carry = 0;
		for (int i = 0; i < size; i++)
		{
			int temp = digit[i] * x + carry;
			carry = temp / 100;
			temp = temp % 100;
			c.digit[c.size++] = temp;
		}
		if (carry!=0)
			c.digit[c.size++] = carry;
		return c;
	}
	bignum operator + (const bignum &a) const
	{
		bignum c;
		c.init();
		int carry = 0;
		for (int i = 0; i < size||i<a.size; i++)
		{
			int temp = digit[i] + a.digit[i] + carry;
			carry = temp / 100;
			temp = temp % 100;
			c.digit[c.size++] = temp;
		}
		if (carry != 0)
			c.digit[c.size++] = carry;
		return c;
	}
	bignum operator / (int x) const
	{
		bignum c;
		c.init();
		int r = 0;
		for (int i = size - 1; i >= 0; i--)
		{
			int temp = (digit[i] + r * 100) / x;
			int rtemp = (digit[i] + r * 100) % x;
			r = rtemp;
			c.digit[i] = temp;
		}
		for (int i = 0; i < 1000; i++)
		{
			if (c.digit[i] != 0)
				c.size = i;
		}
		c.size++;
		return c;
	}
	int operator % (int x) const
	{
		int r = 0;
		for (int i = 0; i < size; i++)
		{
			int rtemp = (r * 100 + digit[i]) % x;
			r = rtemp;
		}
		return r;
	}
}a, b, c;
char str[1000];
char ans[1000];
int main()
{
	int n, m;
	while (scanf("%d%d", &m, &n) != EOF)
	{
		scanf("%s", str);
		int L = strlen(str);
		a.set(0);
		b.set(1);
		for (int i = L - 1; i >= 0; i--)
		{
			int t;
			if ('0'<=str[i]&&str[i]<='9')
				t = str[i] - '0';
			else
				t = str[i] - 'A' + 10;
			a = a + b * t;
			b = b * m;
		}
		int size = 0;
		do
		{
			int t = a % n;
			if (t < 10)
				ans[size++] = t + '0';
			else
				ans[size++] = t - 10 + 'a';
			a = a / n;
		} while (a.digit[0] != 0 || a.size != 1);
		for (int i = size - 1; i >= 0; i--)
			printf("%c", ans[i]);
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值