大整数加法【信息学奥赛一本通-1168】
1168:大整数加法
1168:大整数加法
【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555
问题分析
- 为什么使用数组
因为 int 的字节长度是4个字节,占32位,数值范围在 -32768~32767
long long 的字节长度是8个字节,占64位,的数值范围 -2147483648~2147483647
题目当中计算最高200位的数值运算使用 int 或 long long 已经不满足了
所以我们采用数组,运用加法基本原理,逢十进一,来解决高精度加法计算问题
我们以输入 123456789 + 5723169 为例 - 使用字符数组来接收
char a[1000], b[1000];cin >> a >> b;或者char a[1000], b[1000];cin.getline(a, 1000);cin.getline(b, 1000);
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | ... |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... |
b[0] | b[1] | b[2] | b[3] | b[4] | b[5] | b[6] | ... |
5 | 7 | 2 | 3 | 1 | 6 | 9 | ... |
- 把字符数组转换成整型数组
// 字符数组 a 转换 注意字符数组与整型数组数值存放的位置(颠倒)int la[1000];memset(la, 0, sizeof(la)); // 初始化 la 数组,使之都为0int lena = strlen(a); // 求实际输入字符数组 a 的长度for (int i = 0; i < lena; i++) {la[i] = a[lena - 1 - i] - '0'; // 数字字符转换成整型数字的时候,需要减字符'0',或者减48,参考阿斯克码表}// 字符数组 b 转换 同字符数组 a 的转换int lb[1000];memset(lb, 0, sizeof(lb));int lenb = strlen(b);for (int i = 0; i < lenb; i++) {lb[i] = b[lenb - 1 - i] - '0';}
la[0] | la[1] | la[2] | la[3] | la[4] | la[5] | la[6] | la[7] | la[8] | ... |
9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | ... |
lb[0] | lb[1] | lb[2] | lb[3] | lb[4] | lb[5] | lb[6] | ... |
9 | 6 | 1 | 3 | 2 | 7 | 5 | ... |
lc[0] | lc[1] | lc[2] | lc[3] | lc[4] | lc[5] | lc[6] | lc[7] | lc[8] | ... |
... |
- 运用加法原理进行计算(逢十进一)
int lc[1010], lenc = 0; // lc 表示计算的结果,lenc 表示结果有多少位memset(lc, 0, sizeof(lc));for (int i = 0; i < lena || i < lenb; i++) {lc[i + 1] = (la[i] + lb[i]) / 10; // 进位lc[i] = (la[i] + lb[i]) % 10; // 取个位lenc++; // 记录和的结果有多少位}
- 去掉最高位之前的零,输出整型数组 lc
while (lc[lenc] == 0 && lenc >= 0) { lenc--; // 去掉最高位之前的零}for (int i = lenc; i >= 0; i--) {cout << lc[i]; // 注意数字在数组中保存的位置 }
参考代码
#include <bits/stdc++.h>using namespace std;int main() {char a[1000], b[1000];cin.getline(a, 1000);cin.getline(b, 1000);int la[1000], lb[1000], lc[1010], lenc = 0;memset(la, 0, sizeof(la));memset(lb, 0, sizeof(lb));memset(lc, 0, sizeof(lc));int lena = strlen(a),lenb = strlen(b);for (int i = 0; i < lena; i++) {la[i] = a[lena - 1 - i] - '0';}for (int i = 0; i < lenb; i++) {lb[i] = b[lenb - 1 - i] - '0';}for (int i = 0; i < lena || i < lenb; i++) {lc[i + 1] = (la[i] + lb[i] + lc[i]) / 10;lc[i] = (la[i] + lb[i] + lc[i]) % 10;lenc++;}while (lc[lenc] == 0 && lenc >= 0) {lenc--;}for (int i = lenc; i >= 0; i--) {cout << lc[i];}cout << endl;return 0;
}
大整数加法【信息学奥赛一本通-1168】相关推荐
- 信息学奥赛一本通 1168:大整数加法 | OpenJudge NOI 1.6 10:大整数加法
[题目链接] ybt 1168:大整数加法 OpenJudge NOI 1.6 10:大整数加法 [题目考点] 1. 高精度 考察:高精加高精 高精度计算讲解 [解题思路] 注意:输入可能有多余的前导 ...
- 最小新整数(信息学奥赛一本通-T1231)
[题目描述] 给定一个十进制正整数n(0<n<1000000000),每个数位上数字均不为0.n的位数为m. 现在从m位中删除k位(0<k<m),求生成的新整数最小为多少? 例 ...
- 输出第二个整数(信息学奥赛一本通-T1002)
[题目描述] 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数.把第二个输入的整数输出. [输入] 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. [输出] 只有一 ...
- 1.6编程基础之一维数组 10大整数加法
1.6编程基础之一维数组 10大整数加法 OpenJudge - 10:大整数加法 1168:大整数加法 信息学奥赛一本通(C++版)在线评测系统 P1601 A+B Problem(高精) A+B ...
- 信息学奥赛一本通:1168:大整数加法
1168:大整数加法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 76804 通过数: 25726 [题目描述] 求两个不超过200位的非负整数的和. ...
- 信息学奥赛一本通(1168:大整数加法)
1168:大整数加法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 44610 通过数: 14295 [题目描述] 求两个不超过200位的非负整数的和. ...
- 信息学奥赛一本通(c++):1168:大整数加法
一.题目 1168:大整数加法 时间限制: 1000 ms 内存限制: 65536 KB [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位 ...
- 信息学奥赛一本通(c++):1124:矩阵加法
信息学奥赛一本通(c++):1124:矩阵加法 一.题目 1124:矩阵加法 时间限制: 1000 ms 内存限制: 65536 KB [题目描述] 输入两个n行m列的矩阵A和B,输出 ...
- 1168:大整数加法--2022.01.22 AC
/* 1168:大整数加法--2022.01.22 AC http://ybt.ssoier.cn:8088/problem_show.php?pid=1168c++中 cin.cin.get().c ...
最新文章
- Anytime项目开发记录0
- 团队-石头,剪刀,布-设计文档
- Android应用坐标系统全面详解
- java不要无限循环_java – 看似无限循环终止,除非使用System.out.println
- am335x linux修改ip,Linux 修改代码以支持LED 控制(board-am335xevm)
- castle典范英语 storm_典范英语
- 钉钉机器人智能提醒_利用钉钉机器人和语雀提高协同办公效率
- label confusion learning to enhance text classification models
- windows操作系统服务器 网卡速度关联项
- CSDN-JayChou测试
- [IOS初学]ios 第一篇 storyboard 与viewcontroller的关系 - Zoe_J
- 3 求最大公约数和最小公倍数
- Android中画布连线的连线动画的实现
- 二维码支付的优势与劣势
- 深圳大学计算机刘霖,深圳大学传播学院
- LINUX暂停、挂起进程,开启进程
- nltk安装,语料库nltk下载
- tcp协议的三次握手
- python在生物学的应用_Python生物学Cookbook - Bioinformatics with Python 2nd
- Web简单快捷的指纹识别小工具_在线指纹识别平台设计