高精度的四则运算的简单介绍

序:高精度的问题引入

你所需要解决的问题中,所需计算的数字已经非常大,不能再用基本数据类型存储了。

数字的输入和存储:可以用数组和字符串进行处理。字符串的优点是,能方便的进行输入输出。数组的优点是,存储的是数的形式,可以直接进行运算。结合两者的优点:

用字符串进行输入,经过转换,放入数组里,再用数组进行运算处理。

注:将数字输入到字符串中,再从字符串存入数组时,需要有有一个逆置的过程。

一、高精度加法

代码实现如下:

    #include <iostream>
	using namespace std;
	#include <string>

	string x, y;
	int a[100000], b[100000], c[100000];

	int main()
	{
	    int la, lb, lc;
	    cin >> x >> y;  //用字符串输入
	    la = x.length();
	    lb = y.length();
	    lc = max(la, lb);
	    for (int i = 0; i < la; i++)
	    {
	        a[la - i] = x[i] - '0';  //存入数组a[]里
	    }
	    for (int i = 0; i < lb; i++)
	    {
	        b[lb - i] = y[i] - '0';  //存入数组b[]里
	    }
	    int temp=0;
	    for (int i = 1; i <= lc; i++)  //最重要的运算环节
	    {
	        c[i] += a[i] + b[i];
	        c[i + 1] = c[i] / 10;
	        c[i] = c[i] % 10;
	        temp = c[i + 1];
	    }
	    int m;
	    if (temp == 0)  m = lc;  //对加法进位的处理
	    else  m = lc + 1;
	    for (; m > 0; m--)
	    {
	        cout << c[m];
	    }
	    return 0;
	}

训练题目:洛谷题号 P1601 A+B Problem(高精)

二、高精度减法

代码实现如下:

	#include <iostream>
	using namespace std;
	#include <string>
	int a[100000], b[100000], c[100000];
	string x, y;
	int main()
	{
	    cin >> x >> y;  //存入字符串
	    int la = x.length();
	    int lb = y.length();
	    if (la < lb || (lb == la && x < y))  //判断结果是否为负数
	    {
	        swap(x, y);                    //使x中的数字永远大于y中的
	        swap(la, lb);
	        cout << "-";
	    }
	    for (int i = 0; i < la; i++)
	    {
	        a[la - i] = x[i] - '0';
	    }
	    for (int i = 0; i < lb; i++)
	    {
	        b[lb - i] = y[i] - '0';
	    }
	    for (int i = 1; i <= la; i++)  //最重要的运算环节
	    {
	        if (a[i] < b[i])
	        {
	            a[i] += 10;
	            a[i + 1]--;
	        }
	        c[i] = a[i] - b[i];
	    }
	    while (c[la]==0 && la>1) la--;  //对最高位消为0的情况进行处理
	    for (int i = la; i >= 1; i--)
	    {
	        cout << c[i];
	    }
	    return 0;
	}

训练题目:洛谷题号 P2142 高精度减法

三、高精度乘法

代码实现如下:

	#include <iostream>
	#include <string>
	using namespace std;
	int a[100000], b[100000], c[100000], la, lb, lc;
	string x, y;
	int main()
	{
	    cin >> x >> y;
	    la = x.length(); lb = y.length();  //存入字符串

	    for (int i = 0; i < la; i++)
	    {
	        a[la - i] = x[i] - '0';
	    }
	    for (int i = 0; i < lb; i++)
	    {
	        b[lb - i] = y[i] - '0';
	    }
	    for (int i = 1; i <= lb; i++)  //最重要的运算环节
	    {
	        for (int j = 1; j <= la; j++)
	        {
	                c[i + j - 1] += b[i] * a[j];
	                c[i + j] += c[i + j - 1] / 10;
	                c[i + j - 1] = c[i + j - 1] % 10;
	        }
	    }
    
	    lc = la + lb;                       //对结果的位数进行猜测
	    while (c[lc] == 0 && lc > 1) lc--;//对位数过多,最高位为0的处理
	    for (int i = lc; i >= 1; i--)
	    {
	        cout << c[i];
	    }
	    return 0;
	}

训练题目:洛谷题号 P1303 A*B Problem

四、高精度除法

高精度的除法可以分为两类:高精度除以低精度,高精度除以低精度。

高精度除以低精度的代码实现如下:

	#include <iostream>
	#include <string>
	using namespace std;

	int a[10000000], c[10000000];
	long long b, la, temp;
	string x;
	int main()
	{
	    int  m = 0;
	    cin >> x >> b;
	    la = x.length();
	    for (int i = 0; i < la; i++)
	        a[i] = x[i] - '0';
	    for (int i = 0; i < la; i++)  //最重要的运算环节
	    {
	        c[i] = (temp * 10 + a[i]) / b;
	        temp = (a[i] + temp * 10) % b;
	    }
	    while (c[m] == 0 && m < la-1 ) m++;
	    for (; m < la; m++)
	    {
	        cout << c[m];
	    }
	    return 0;
	}

训练题目:洛谷题号 P1480 A/B Problem

高精度除以高精度的代码,还未学完。。。╮( ̄▽ ̄)╭

五、进制的转化

在高精度中的最重要的运算环节中,稍加改动就可以变成进制的转化器。

代码实现如下:

 	#include <iostream>
	 #include <string>
 	using namespace std;

 	int a[10000000], c[10000000];
	long long b, la, temp;
	string x;
	int main()
	{
	    int  m = 0;
	    cin >> x >> b;
	    la = x.length();
 	   for (int i = 0; i < la; i++)
 	   a[i] = x[i] - '0';
 	   for (int i = 0; i < la; i++)  //这,这,这,就在这
	    {
	        c[i] = (temp * 10 + a[i]) / b;
	        temp = (a[i] + temp * 10) % b;
	        cout << c[i];
	    }
	    while (c[m] == 0 && m < la-1 ) m++;
	    for (; m < la; m++)
	    {
	        cout << c[m];
	    }
	    return 0;
	}

训练题目: 洛谷题号 P1604 B进制星球

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值