高精度加法(含代码)
Posted C++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度加法(含代码)相关的知识,希望对你有一定的参考价值。
高精度加法
例 1
例如: 1111111111111+9, 列成竖式
,
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 9
---------------------------
先算个位,
1
+9
=10
,
满10
, 向十位进1
。
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 9
1
---------------------------
0
接下来, 处理进位。
十位: 1+1=2 -> 2
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 9
1
---------------------------
2 0
百位: 无进位, 直接照抄. 1 -> 1
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 9
1
---------------------------
1 2 0
千位: 1 -> 1
万位: ...
...: ...
最高位: 1 -> 1
最终结果:
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 9
1
---------------------------
1 1 1 1 1 1 1 1 1 1 1 2 0
所以, 1111111111111+9=1111111111120
例 2
1111111111111+8888888888889,
这个算式变成了高精度
+高精度
了。
还是列成竖式,
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
---------------------------
先算个位,
1
+9
=10
,
满10
, 向十位进1
。
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1
---------------------------
0
接下来, 算十位。
1
+8
+1=10
,
满10
, 向百位进1
。
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1 1
---------------------------
0 0
千位, 万位...以此类推。
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1 1 1
---------------------------
0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1 1 1 1
---------------------------
0 0 0 0
......
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1 1 1 1 1 1 1 1 1 1 1 1
---------------------------
0 0 0 0 0 0 0 0 0 0 0 0
最高位:
1
+8
+1=10
,
向前一位进1.
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1 1 1 1 1 1 1 1 1 1 1 1 1
---------------------------
0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1 1 1 1 1 1 1 1 1 1 1 1 1
---------------------------
1 0 0 0 0 0 0 0 0 0 0 0 0 0
所以,
1111111111111
+8888888888889
=10000000000000
=1013
1 1 1 1 1 1 1 1 1 1 1 1 1
+ 8 8 8 8 8 8 8 8 8 8 8 8 9
1 1 1 1 1 1 1 1 1 1 1 1 1
---------------------------
1 0 0 0 0 0 0 0 0 0 0 0 0 0
代码
- 首先导入头文件。
// 1. Import libraries
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>
#include <cassert>
#include <vector>
// Import namespace \'std\'
using namespace std;
- 初始化变量。
// 2. Initialize variables
const int MAX = 1000;
char s[MAX+1];
int a[MAX+1], b[MAX+1],c[MAX+2];
- 定义主函数
main()
// 3. Define Main Function
int main(int argc, char **argv)
for (int i=0;i<1001;i++)
s[i]=\'0\';
a[i]=0, b[i]=0, c[i]=0;
// If you use global variables, this initialization does not need used.
这里如果使用全局变量,这个初始化可以不用。
4. 输入(包含了处理)变量
// 4. Input and process variables
scanf("%s",s+1);
int lena = strlen(s+1);
for (int i=1;i<=lena+1;i++)
a[i] = s[lena-i+1] - \'0\';
scanf("%s",s+1);
int lenb = strlen(s+1);
for (int i=1;i<=lenb+1;i++)
b[i] = s[lenb-i+1] - \'0\';
int lenc = (lena>lenb)?lena:lenb;
- 真正的高精度计算到这里才开始。计算代码
// 5. Calculate
for (int i=1;i<=101;i++)
c[i] = 0;
for (int i=1;i<=lenc;i++)
// c[i] = a[i] + b[i]; <-- Wrong!
c[i] = a[i] + b[i] + c[i]; // <-- Correct
// c[i] += a[i] + b[i]; <-- Plan B, Correct too
// 处理进位
c[i+1] = c[i] / 10;
c[i] = c[i] % 10;
// 处理 overflow
if (c[lenc+1]>0)
lenc++;
- 输出
// 6. Output
for (int i=lenc;i>=1;i--)
printf("%d", c[i]);
return 0;
附: 完整代码
// 1. Import libraries
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>
#include <cassert>
#include <vector>
// Import namespace \'std\'
using namespace std;
// 2. Initialize variables
const int MAX = 1000;
char s[MAX+1];
int a[MAX+1], b[MAX+1],c[MAX+2];
// 3. Define Main Function
int main(int argc, char **argv)
for (int i=0;i<1001;i++)
s[i]=\'0\';
a[i]=0, b[i]=0, c[i]=0;
// If you use global variables, this initialization does not need used.
// 4. Input and process variables
scanf("%s",s+1);
int lena = strlen(s+1);
for (int i=1;i<=lena+1;i++)
a[i] = s[lena-i+1] - \'0\';
scanf("%s",s+1);
int lenb = strlen(s+1);
for (int i=1;i<=lenb+1;i++)
b[i] = s[lenb-i+1] - \'0\';
int lenc = (lena>lenb)?lena:lenb;
// 5. Calculate
for (int i=1;i<=101;i++)
c[i] = 0;
for (int i=1;i<=lenc;i++)
// c[i] = a[i] + b[i]; <-- Wrong!
c[i] = a[i] + b[i] + c[i]; // <-- Correct
// c[i] += a[i] + b[i]; <-- Plan B, Correct too
// 处理进位
c[i+1] = c[i] / 10;
c[i] = c[i] % 10;
// 处理 overflow
if (c[lenc+1]>0)
lenc++;
// 6. Output
for (int i=lenc;i>=1;i--)
printf("%d", c[i]);
return 0;
复制之前看我一下
`Control`, 缩写为Ctrl, 扩写为唱,跳,rap,篮球。 你还敢Ctrl+C吗?[========]
[========]
[========]
[========]
本文来自博客园,作者:Admin--002,转载请注明原文链接:https://www.cnblogs.com/Py-Study0/p/High-precision_addition-114514.html
高精度小数加法
例题链接:hdu1753 http://acm.hdu.edu.cn/showproblem.php?pid=1753
代码:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn = 500; char a[maxn]; char b[maxn]; int aa1[maxn]; int aa2[maxn]; int bb1[maxn]; int bb2[maxn]; int ansx[maxn]; int ansz[maxn]; int main() { while(~scanf("%s%s",&a,&b)) { memset(aa1 , 0 , sizeof(aa1)); memset(aa2 , 0 , sizeof(aa2)); memset(bb1 , 0 , sizeof(bb1)); memset(bb2 , 0 , sizeof(bb2)); memset(ansx , 0 ,sizeof(ansx));//小数的答案数组 memset(ansz , 0 ,sizeof(ansz));//整数的答案数组 int lena, lenb; int i,j; ///处理串a int ta = lena = strlen(a); for(i = 0; i < lena ; i++) { if(a[i] == ‘.‘) { ta = i; break; } } ///整数逆存存放, 比如 1 2 3 存为 3 2 1 for(i = ta - 1; i >= 0; i--) { aa1[ta - i - 1] = a[i] - ‘0‘; } ///小数正序存放 ,比如 4 5 6 存为 4 5 6 j = 0; for(i = ta + 1; i < lena ; i++) { aa2[j++] = a[i] - ‘0‘; } ///处理串b int tb = lenb = strlen(b); for(i = 0; i < lenb ; i++) { if(b[i] == ‘.‘) { tb = i; break; } } ///整数逆存存放, 比如 1 2 3 存为 3 2 1 for(i = tb - 1; i >= 0; i--) { bb1[tb - i - 1] = b[i] - ‘0‘; } ///小数正序存放 ,比如 4 5 6 存为 4 5 6 j = 0; for(i = tb + 1; i < lenb ; i++) { bb2[j++] = b[i] - ‘0‘; } ///ADD ///小数 int lenaa2 = lena - ta; int lenbb2 = lenb - tb; int lenx = lenaa2 > lenbb2 ? lenaa2 : lenbb2; int jinwei = 0; for(i = lenx - 1; i >= 0 ; i--) { ansx[i] = (aa2[i] + bb2[i] + jinwei)%10; jinwei = (aa2[i] + bb2[i] + jinwei)/10; } int lenz = ta > tb ? ta : tb; for(i = 0; i <= lenz ; i++) { ansz[i] = (aa1[i] + bb1[i] + jinwei)%10; jinwei = (aa1[i] + bb1[i] + jinwei)/10; } if(ansz[lenz] > 0) lenz++; for(i = lenz - 1; i >= 0; i--) { printf("%d",ansz[i]); } while(ansx[lenx - 1] == 0) { if(ansx[lenx - 1] == 0) { lenx--; } } if(lenx > 0) printf("."); for(i = 0; i < lenx ; i++) { printf("%d",ansx[i]); } printf("\n"); } return 0; }
以上是关于高精度加法(含代码)的主要内容,如果未能解决你的问题,请参考以下文章