欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 算法基础——高精度

算法基础——高精度

2025/4/21 22:38:24 来源:https://blog.csdn.net/2303_77692691/article/details/146573990  浏览:    关键词:算法基础——高精度

当数据的值特别⼤,各种类型都存不下的时候,此时就要用高精度算法来计算加减乘除:

  • 先用字符串读⼊这个数,然后用数组逆序存储该数的每⼀位;
  • 利⽤数组,模拟加减乘除运算的过程。

高精度算法本质上还是模拟算法,用代码模拟小学列竖式计算加减乘除的过程。

1. 高精度加法

题⽬来源: 洛⾕

题⽬链接: P1601 A+B Problem(⾼精)

难度系数: ★

【解法】

模拟小学列竖式计算过程

  1. 先用字符串读⼊,拆分每一位,逆序放在数组中
  2. 利用数组,模拟小学列竖式计算加法的过程

                (1)对应两位相加,然后加上进位

                (2)处理进位 -> x/10

                (3)处理余数 -> x%10

【参考代码】

#include<iostream>
using namespace std;const int N = 1e6 + 10;int a[N],b[N],c[N];
int la,lb,lc;
string s1,s2;int main(){cin >> s1 >> s2;//拆分每一位,逆序放在数组中 la = s1.size();lb = s2.size();lc = max(la,lb);for(int i = 0;i < la;i++){a[i] = s1[la-1-i] - '0';}for(int i = 0;i < lb;i++){b[i] = s2[lb-1-i] - '0';}//模拟加法的过程 for(int i = 0;i < lc;i++){int x = a[i] + b[i] + c[i];// 对应两位相加,然后加上进位c[i+1] = x / 10;//处理进位c[i] = x % 10;//处理余数}if(c[lc]) lc++;//边界情况 //输出结果 for(int i = lc - 1;i >= 0 ;i--){cout << c[i];}return 0;
}

2 .高精度减法

题⽬来源: 洛谷 

题目链接: P2142 高精度减法

难度系数: ★

【解法】

  1. ⽤字符串读⼊数据,
  2. 判断两个数的大小,让较大的数在前。注意字典序 vs 数的大小

                a. 位数相等:按字典序比较;

                b. 位数不等:按照字符串的长度比较

     3.将字符串的每⼀位拆分,逆序放在数组中;

     4.模拟列竖式计算的过程

                a. 对应位求差;

                b. 处理借位;

     5.处理前导零。

【参考代码】

#include<iostream>
using namespace std;const int N = 1e6 + 10;
int a[N],b[N],c[N];
int la,lb,lc;bool cmp(string& x,string& y){//先比较长度 if(x.size() != y.size()) return x.size() < y.size();//按字典序比较 return x < y;
}void sub(int a[],int b[],int c[]){for(int i = 0;i < lc;i++){c[i] += a[i] - b[i]; if(c[i] < 0){c[i + 1] -= 1; //处理借位c[i] += 10; }}//处理前导零while(lc > 1 && c[lc-1] == 0) lc--;
}
int main(){string x,y;cin >> x >> y;//比较两个数的大小if(cmp(x,y)){swap(x,y);cout << "-";}la = x.size();lb = y.size();lc = la;//将字符串的每一位拆分,逆序放在数组中for(int i = 0;i < la;i++) a[i] = x[la - 1 - i] - '0';for(int i = 0;i < lb;i++) b[i] = y[lb - 1 - i] - '0';//减法sub(a,b,c);//输出结果for(int i = lc - 1;i >= 0;i++) cout << c[i]; return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词