高精度加法(A+BProblemII)
好久没有写文章了,主要是近期开学上网课再加上刷题的缘故,日常有些忙碌。
话不多说,接下来是正题:
一切问题都是有源头的,在这里我就直接先放题了。
接下来我以代码+部分代码的解释+注意事项进行
ps:(代码运行环境 vs2019,代码出现的_s属于vs2019上的安全书写)
代码如下:
#include<stdio.h>
#include<string.h>
char a[1010];
char b[1010];
int bf[1010];
int c[1010] = { 0 };
int main()
{int t,i,x,y,max,flag,p,ok;p = 0;scanf_s("%d", &t);while (t--){p++;flag = 0;memset(a, 0, sizeof a);memset(b, 0, sizeof b);memset(c, 0, sizeof c);memset(bf, 0, sizeof bf);scanf_s("%s", a, 1010);scanf_s("%s", b, 1010);x = strlen(a);y = strlen(b);max = x;if (x > y){flag = 1;max = x;int tmp = -1;for (i = 0; i < x; i++){if (i <= x - y - 1)bf[i] = 0;elsebf[i] = b[++tmp]-48;}}if(x<y){flag = 2;max = y;int tmp = -1;for (i = 0; i < y; i++){if (i <= y - x - 1)bf[i] = 0;elsebf[i] = a[++tmp]-48;}}if (flag == 0){for (i = max - 1; i >= 0; i--){if (c[i+2] >= 10){c[i + 1] += c[i + 2] / 10;c[i+2] = c[i+2] % 10;}c[i + 1] += a[i] + b[i] - 48 - 48;}}if (flag == 1){for (i = max - 1; i >= 0; i--){if (c[i + 2] >= 10){c[i + 1] += c[i + 2] / 10;c[i + 2] = c[i + 2] % 10;}c[i + 1] += a[i] + bf[i] - 48;}}if (flag == 2){for (i = max - 1; i >= 0; i--){if (c[i + 2] >= 10){c[i + 1] += c[i + 2] / 10;c[i + 2] = c[i + 2] % 10;}c[i + 1] += bf[i] + b[i] - 48;}}printf("Case %d:\n", p);for (i = 0; i < x; i++){printf("%d", a[i] - 48);}printf(" + ");for (i = 0; i < y; i++){printf("%d", b[i] - 48);}printf(" = ");for (i = 0; i <= max; i++){ok = 1;if (c[0] == 0){ok = 0;c[0] = 1;}if(ok==1)printf("%d", c[i]);}printf("\n");}
}
该题的核心————》高精度
因为题上的意思a,b两个数可以看做1000位的正整数,因此就算是unsigned long long也无法正常存储,所以我们需要用数组来接收数据,同时也需要借助数组来处理数据,最后用数组输出数据。
高精度加法,高精度——》数据大,加法——》还是普通的加法,不要被虎着。
核心处理——》加法and进位
加法,就是从个位开始加(小学加法列竖式 能更好地理解);
进位,就是满10进1;
注意:
1.
c[i + 1] += c[i + 2] / 10;
c[i + 2] = c[i + 2] % 10;
这两个顺序不要反,别人你的输出很有可能前面是10101010...这样,因为如果反写
c[i + 2] = c[i + 2] % 10;
c[i + 1] += c[i + 2] / 10;
第一次处理后,c[i + 1]的值就可能发生变化,与想的逻辑就存在偏差
2.
进位的时候为什么要i+1?(换句话来说,就是为什么接收处理数据的数组要开的比max大1?)
这个也很好理解,举个例子99 +11 = 110,可能数据处理最终结果的长度比max大1。看完这个例子,应该就明白+1这个小细节了。
3.
为什么代码中有补0模块?
举个例子1234 123,这个数据在数组中的位置如下:
0 1 2 3 4(坐标)
1 2 3 4
1 2 3
因为我们加法执行逻辑是从个位开始一次加(和进位)
为了让我们代码按数学逻辑正常执行,我们进行补0操作
结果如下:
0 1 2 3 4(坐标)
1 2 3 4
0 1 2 3
然后数据处理就不会有操作逻辑上的问题
通过这个例子就可以很好的理解为什么要补0
4.
进位要放在“加”数据处理的前面(也就是相同位上的数字相加这个模块的前面)
具体为什么,大家有兴趣可以试一下,对比对比。
在最后感谢大家的阅读,
欢迎大家点赞评论+关注,
该代码不是最优代码,也希望大家多评论交流,相互进步!
高精度加法(A+BProblemII)相关推荐
- 基础练习 高精度加法
基础练习 高精度加法 时间限制:1.0s 内存限制:512.0MB 问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标 ...
- 用C++的类重载高精度加法,乘法和等于符号
运行结果: 代码如下: #include<iostream> #include<algorithm> #include<string.h> #include< ...
- PAT甲级1024 Palindromic Number:[C++题解]回文串和高精度加法
文章目录 题目分析 题目链接 题目分析 一个判断是否是回文数的函数:check,思路是使用双指针从两端分别往里走. 另一个是高精度加法函数add,传入两个vector. 另外,vector逆序构造可以 ...
- PAT甲级1023 Have Fun with Numbers:[C++题解]高精度加法和两个vector大小比较
文章目录 题目分析 题目链接 题目分析 使用高精度加法高精度加法板子求 这个数的两倍,存在一个vector中. 所谓高精度就是使用string来存大的数,然后模拟列竖式加法,结果一位一位压入数组vec ...
- 高精度加法(C++实现)
高精度加法 简介 用于计算含有超过一般变量存放不下的非负整数 高精度加法这个过程是模拟的小学竖式加法计算 步骤 以下有顺序之分 数组清零 输入 获取长度 逆置 字符型数字转成对应的整型数字 计算并输出 ...
- 《信息学奥赛一本通》 高精度加法。输入两个正整数,求它们的和。
高精度加法.输入两个正整数,求它们的和. 算法分析 升级版代码 算法分析 输入两个数到两个变量中,然后用赋值语句求它们的和,输出.但是,我们知道,在C++语言中任何数据类型都有一定的表示范围.当两个被 ...
- 高精度加法(非负)和大数阶乘及和汽水问题
高精度加法(非负)和大数阶乘 文章目录 高精度加法(非负)和大数阶乘 一.问题描述 二.代码 三.问题描述 四.代码 五.问题描述 六.代码 一.问题描述 二.代码 #define _CRT_SECU ...
- CCF NOI1138 高精度加法
问题链接:CCF NOI1138 高精度加法. 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 给两个正整数,计算它们的和. 输入 两行,每行表示一个数(位数达10000位). ...
- 高精度加法 problem A+B
题目描述 高精度加法,相当于 a+b problem,不用考虑负数. 输入格式 分两行输入.a,b <=10^500 输出格式 输出只有一行,代表 a+b 的值. 输入输出样例 输入 1001 ...
最新文章
- Alphabet股价周五跌5.32%:三年最大单日跌幅
- jQuery mobile 中div圆角弹出层
- MyBatis的运行的核心原理解析(三)
- Java 读文件的5种方式
- php mysql explain_Mysql分析-explain的详细介绍
- C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)
- html管道符需要转义么,为什么String.split需要管道分隔符进行转义?
- 多个kinect标定,颜色和深度的标定
- 记事本html表白,霸道总裁之代码强势表白
- aida64怎么测试cpu稳定性_怎么测试电脑CPU稳定性
- 普通高中信息技术课程标准( 必修 选修科目)
- windows云服务器,如何使用windows云服务器
- 微信开发公众号本地调试
- (2)马裤分:七分裤(长度为 70cm
- 微信小程序实现音乐播放器(2)
- MATLAB R2021a 绘图函数fplot 使用详解
- PyQt5 QThread
- 微信小程序——音乐播放器
- 全球与中国自洁式空气过滤器市场现状及未来发展趋势(2022)
- SLS机器学习介绍(01):时序统计建模