高精度

#include<string.h>
#include<iostream>
struct bign
{
	int d[1000];
	int len;
	bign()
	{
		memset(d, 0, sizeof(d));
		len = 0;
	}
	bign change(char str[])
	{
		bign a;
		a.len = strlen(str);
		for (int i = 0; i < a.len; i++)
		{
			a.d[i] = str[a.len - i - 1] - '0';
		}
		return a;
	}
	int compare(bign a, bign b)
	{
		if (a.len > b.len) 
		{
			return 1;
		}
		else if (b.len > a.len)
		{
			return -1;
		}
		else 
		{
			for (int i = a.len-1; i >=0; i--)
			{
				if (b.d[i] > a.d[i])
				{
					return -1;
				}
				if (a.d[i] > b.d[i])
				{
					return 1;
				}
			}
			return 0;
		}
	}
	bign add(bign a, bign b)//高精度a+b
	{
		bign c;
		int carry = 0;//进位
		for (int i = 0; i < a.len || i < b.len; i++)
		{
			int temp = a.d[i] + b.d[i] + carry;
			c.d[c.len++] = temp % 10;
			carry = temp / 10;
		}
		
		if (carry > 0)
		{
			c.d[c.len++] = carry;
		}
		return c;
	}
	void print(bign a)
	{
		for (int i = a.len - 1; i >= 0; i--)
		{
			printf("%d", a.d[i]);
		}
	}
	bign sub(bign a, bign b)//高精度a-b
	{
		bign c;
		for (int i = 0; i < a.len || i < b.len; i++)
		{
			if (a.d[i] < b.d[i])
			{
				a.d[i] += 10;
				a.d[i + 1] --;
			}
			c.d[c.len++] = a.d[i]-b.d[i];
		}
		//去除高位的0
		while (c.len - 1 > 0 && c.d[c.len - 1] == 0)
		{
			c.len--;
		}
		return c;
	}
	bign mul(bign a, int b)//高精度*低精度
	{
		bign c;
		//将b看作一个整体
		int carry = 0;
		for (int i = 0; i < a.len; i++)
		{
			int temp = a.d[i] * b+carry;
			carry = temp / 10;
			c.d[c.len++] = temp % 10;
		}
		while (carry != 0)
		{
			c.d[c.len++] = carry % 10;
				carry /= 10;
		}
		return c;
	}
	bign divide(bign a, int b, int& r)//高精度除法,r为余数
	{
		bign c;
		c.len = a.len;
		for (int i = a.len - 1; i >= 0; i--)
		{
			r = r * 10 + a.d[i];
			if (r < b) {//不够除
				c.d[i] = 0;
			}
			else {
				c.d[i] = r / b;
				r = r % b;
			}
		}
		while (c.len - 1 > 0 && c.d[c.len - 1] == 0)
		{
			c.len--;
		}
		return c;
	}
};
posted @ 2021-09-02 19:22  小帆敲代码  阅读(24)  评论(0编辑  收藏  举报