带图详解 【算法模板】高精度模板

文章目录四、高精度除法
【带图详解【算法模板】高精度模板】一、高精度加法模板
输入两个数到变量中,然后用赋值语句求它们的和后输出 . 但是,我们知道,在 C/C++ 语言中任何数据类型都有一定表示范围. 当两个加数很大时,以前的算法显然不能求出精确解,因此我们需要寻求另一种方法 .在读小学时,我们做加法都采用竖式方法 . 这样我们方便写出两个整数相加的算法 .
c[0]=1,c[1]=1,c[2]=1,c[3]=1;
需要注意c从个位开始的,输出需从最大位序倒叙输出(置输出要去除多余的零)
#includeusing namespace std;const int N = 10000;#define LENGTH 1001void HighAdd(string x, string y) {int a[1000]={0}, b[1000]={0}, c[1000]={0}, len; //建立三个数组保存数//逆置字符串数据,让两个数可以从低位加到高位for (int i = 0; i < x.size(); i++)a[i] = x[x.size() - i - 1]-'0';for (int i = 0; i < y.size(); i++)b[i] = y[y.size() - 1 - i]-'0';//加起来的数的长度不会超过原先两个数的长度最大值len = max(x.size(), y.size());for (int i = 0; i < len; i++) {c[i] += a[i] + b[i];//两数相加,再加上前面计算的进位c[i + 1] += c[i]/10;//把进位存到i+1位上c[i] %= 10;//模10取余0-9的数存在数组中}len++;//如果有进位就多显示一位(这句话很重要)while ((c[len-1] == 0) && (len > 1)) len--;//去除前面的前导零,防止后面逆置输出多余的零//重新逆置,从高位到低位for (int i = len - 1; i >= 0; i--) printf("%d", c[i]);printf("\n");}
二、高精度减法模板
类似加法,同样使用竖式 。在做减法运算时,需要注意的是:需要有借位处理 。
#includeusing namespace std;const int N = 10000;#define LENGTH 1001void HighSub(string x, string y) {//建立三个数组保存数int a[1000] = { 0 }, b[1000] = { 0 }, c[1000] = { 0 }, len;//逆置字符串数据,让两个数可以从低位加到高位for (int i = 0; i < x.size(); i++)a[i] = x[x.size() - i - 1] - '0';for (int i = 0; i < y.size(); i++)b[i] = y[y.size() - 1 - i] - '0';//加起来的数的长度不会超过原先两个数的长度最大值len = max(x.size(), y.size());for (int i = 0; i < len; i++) {if (a[i] < b[i]) {a[i + 1] -= 1;//向高一位借位a[i] += 10;//给当前位加10}c[i] = a[i] - b[i];//再两数相减}while ((c[len - 1] == 0) && (len > 1)) len--;//去除前导零//重新逆置,从高位到低位for (int i = len - 1; i >= 0; i--)printf("%d", c[i]);printf("\n");}

带图详解  【算法模板】高精度模板

文章插图
三、高精度乘法模板
和加法类似
3.1 高精乘以低精(普遍用到)
#includeusing namespace std;const int N = 10000;#define LENGTH 1001void HighMul(string x, int y) {int a[1000] = { 0 }, len;for (int i = 0; i < x.size(); i++)a[i] = x[x.size() - i - 1] - '0';len = x.size();int tmp=0;for (int i = 0; i < len; i++) {a[i]= a[i] * y+tmp;//运算tmp = a[i] / 10;//进位a[i] %= 10;}//进位不为0if (tmp != 0) {a[len] = tmp;len++;while (a[len-1] > 0) //刚存进去的进位,判断是否大于10需要进位{a[len] = a[len - 1] / 10;a[len - 1] %= 10;len++;}}while ((a[len - 1] == 0) && (len > 1)) len--;for (int i = len - 1; i >= 0; i--)printf("%d", a[i]);}
高精乘以高精
主要怎么存储问题:
我们再声明一个数组c来储存答案 。大家通过一个简单的乘法运算进行模拟就可以看出,以同样的储存规则,
a[0] * b[0] = c[0];
a[0] * b[1] + a[1] * b[0] = c[1];
逐渐我们可以发现规律: "c[i + j] += a[i] * b[j]"同过一个循环去实现,就可以把c[i + j]计算出来,需要指出的是,这里的计算我们还没有进行进位处理 。