高精度加法
例 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 #include #include #include #include #include #include #include // Import namespace "std"using namespace std;
- 初始化变量。
// 2. Initialize variablesconst int MAX = 1000;char s[MAX+1];int a[MAX+1], b[MAX+1],c[MAX+2];
- 定义主函数
main()
// 3. Define Main Functionint 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 #include #include #include #include #include #include #include // Import namespace "std"using namespace std;// 2. Initialize variablesconst int MAX = 1000;char s[MAX+1];int a[MAX+1], b[MAX+1],c[MAX+2];// 3. Define Main Functionint 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吗?[========]
[========]
[========]
[========]