[模板] [高精度] 大数加减 大数乘法 51NOD 1005/1027

39 篇文章 0 订阅
3 篇文章 0 订阅

 

给出2个大整数A,B,计算A+B的结果。

Input

第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)

Output

输出A + B

Input示例

68932147586
468711654886

Output示例

537643802472

 

减法还有点凌乱,慢慢整理,

 

符号判断放在外面了,函数比较好写

卡在string的 > <符号重载是按字典序来的

会判断出1000 > 999的情况

所以不能直接比较数值大小 需要先判断位数

位数相同再用 > < 比较

#include <iostream>
using namespace std;
string sum(string a,string b)
{
	if(b.length() > a.length())
	{
		string tmp = a;
		a = b;
		b = tmp;
	}
	for(int i = a.length()-1,j = b.length()-1;i >= 0;i --,j --)
	{
		a[i] = char(a[i] + (j >= 0 ? b[j] - '0' : 0));
		if(a[i] - '0' >= 10)
		{
			a[i] = char( (a[i] - '0') % 10 + '0' );
			if(i)
				a[i-1] ++;
			else
				a = '1' + a;	
		}
	}
	return a;
}
string jian(string a,string b)
{
	string c;
	if(b.length() > a.length())
	{
		string tmp = a;
		a = b;
		b = tmp;
	}
	else if(b.length() == a.length() && b > a)
	{
		string tmp = a;
		a = b;
		b = tmp;
	}
	for(int i = a.length()-1,j = b.length()-1;i >= 0;i --,j --)
	{
		if(j >= 0)
		{
			if(a[i] - b[j] < 0)
			{
				c = char( ((a[i] + 10) - b[j]) + '0') + c;
				int tmp = i - 1;
				while(a[tmp] == '0')
				{
					a[tmp] = '9';
					tmp --;
				}
				a[tmp] --;
			}
			else
			{
				c = char(a[i] - b[j] + '0') + c;
			}
		}
		else
			c = a[i] + c;
	}
	while(c[0] == '0' && c.length() > 1)
		c.erase(c.begin(),c.begin()+1);
	return c;
}
int main()
{
	string a,b;
	while(cin>>a>>b)
	{
		if(a[0] != '-' && b[0] != '-')
			a = sum(a,b);
		else if(a[0] == '-' && b[0] != '-')
		{
			a.erase(a.begin(),a.begin() + 1);
			if(a.length()  > b.length() || a.length() == b.length() && a > b)
			{
				a = "-" + jian(a,b);
			}
			else
				a = jian(a,b);
		}
		else if(a[0] !='-' && b[0] == '-')
		{
			b.erase(b.begin(),b.begin()+1);
			if(b.length() > a.length() || b.length() == a.length() && b > a)
			{
				a = "-" + jian(a,b);
			}
			else
			{
				a = jian(a,b);
			}
		}
		else 
		{
			a.erase(a.begin(),a.begin() + 1);
			b.erase(b.begin(),b.begin() + 1);
			if (a == "0" && b == "0")
				a = "0";
			else
				a = "-" + sum(a,b);
		}
		cout<<a<<endl;
	}
	return 0;
}

大数乘法

直接全乘了 最后进位

#include <iostream>
using namespace std;

typedef long long ll;
const ll MAXN = 1200;

string a,b;
int aa[MAXN] = {0}, bb[MAXN] = {0}, ans[2 * MAXN] = {0};

string string_multi(string a, string b)
{
    if(b.length() > a.length())
	{
		string tmp = a;
		a = b;
		b = tmp;
	}
	int lena = a.length(), lenb = b.length();
	for(int i = lena - 1, flag = 0; i >= 0 ; i--, flag++)
    {
        aa[flag] = a[i] - '0';
    }
	for(int i = lenb - 1, flag = 0; i >= 0 ; i--, flag++)
    {
        bb[flag] = b[i] - '0';
    }
    for(int i = 0; i < lenb ; i++ )
	{
		for(int j = 0 ; j < lena; j++)
		{
			ans[i + j] += aa[j] * bb[i];
		}
	}
	int flag = 2 * MAXN ;
	for(int i = 0 ; i < flag; i++) //进位
	{
		ans[i + 1] += ans[i] / 10;
		ans[i] = ans[i] % 10;
	}
	flag = 2 * MAXN ;
	for(flag; ans[flag] == 0;flag --);
	string sans;
	for(;flag >= 0;flag --)
		sans = sans + char(ans[flag] + '0');
    return sans;
}

int main()
{
    string a, b, ans;
	cin>>a>>b;
	ans = string_multi(a, b);
	cout<<ans<<endl;
	return 0;
}

 

贴个多进制的高精度加法

#include <iostream>
using namespace std;

const int MAXN = 1e4 + 10;

int arr[MAXN] = {0}, brr[MAXN] = {0}, ans[MAXN] = {0};

int main()
{
    string mode = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    int N;

    cin>>N;

    string a, b;

    cin>>a>>b;

    for(int i = a.length() - 1, j = 0; i >= 0; i--, j++)
    {
        if(a[i] >= '0' && a[i] <= '9')
        {
            arr[j] = a[i] - '0';
        }  
        else
        {
            arr[j] = a[i] - 'A' + 10;
        }

    }

    for(int i = b.length() - 1, j = 0; i >= 0; i--, j++)
    {
        if(b[i] >= '0' && b[i] <= '9')
        {
            brr[j] = b[i] - '0';
        }  
        else
        {
            brr[j] = b[i] - 'A' + 10;
        }

    }

    for(int i = 0; i < MAXN - 10; i++)
    {
        ans[i] += (arr[i] + brr[i]);

        if(ans[i] >= N)
        {
            ans[i + 1] += (ans[i] / N);

            ans[i] %= N;
        }
    }

    int tf = MAXN - 9;

    for( ; ans[tf] == 0 && tf >= 1; tf--);

    for( ; tf >= 0; tf--)
    {
        cout<<mode[ans[tf]];
    }

    cout<<endl;
    
    return 0;
}

高精度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值