大整数加法——求两个不超过200位的非负整数的和
10:大整数加法
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
代码如下
#include<stdio.h>
#include<string.h>
void reverse(char str[],int n);//字符串反转函数
void change(char str[],int n);//字符转数字函数
int main()
{char a[200]={0},b[200]={0};int r[201]={0};int n1,n2,i,max,f=0,k=0;//f用来判断相加结果有无前导0,赋值0表示默认有前导0scanf("%s",a);scanf("%s",b);n1=strlen(a);n2=strlen(b);reverse(a,n1);reverse(b,n2);change(a,n1);change(b,n2);max=(n1>n2)?n1:n2;for(i=0;i<max;i++)//求和过程{r[i]=(a[i]+b[i]+k)%10;k=(a[i]+b[i]+k)/10;//k表示每位数字求和产生的进位}r[i]=k;//要注意可能有最高位进位for(;i>=0;i--){if(f==0&&r[i]==0) continue;//判断结果有无前导0,有则跳过else f=1;//当f为1之后,遇到0就不会再跳过了printf("%d",r[i]);}if(f==0) printf("0");//如果结果就为0(即f的值未修改仍为0),那么输出0,
}
void reverse(char str[],int n)
{int i,t;for(i=0;i<n/2;i++){t=str[i];str[i]=str[n-i-1];str[n-i-1]=t;}
}
void change(char str[],int n)
{int i;for(i=0;i<n;i++) str[i]-=48;
}
这道题做了蛮久,前前后后调试了很久。不过现在回想起来,其实很简单,关键仍是代码的思想。首先对于这类超长正数的加法,在我们人类计算看来与简单的加法其实本质是一样的,就是从个位开始,逐个位顺序相加,满十就进位。而题目为了干扰我们,输入的数据有些有前导0,但明白了计算过程就很简单。首先肯定是让两个数字都从最后一位开始计算,但是如果直接就这么处理,代码就会很复杂,至少看起来就会很头疼。
所以第一步的想法就是先把两个数字的高低位顺序调换,让低位在数组的前面,高位在后面。要注意这行代码for(i=0;i<n/2;i++)
i<n/2,循环次数是数组个数一半,因为每次交换是将数组中的两个元素进行位置交换。(对于奇数个元素的数组就是最中间元素不交换,其他元素进行交换)
然后就是两个数组从[0]开始按顺序相加就行。
接下来就是要思考如何相加,因为数组里存的是字符,而不是整数,所以在做加法时就不能想当然的按整数进行加法运算。这里我就先想到把字符转换成数字,也就是void change(char str[],int n);
函数的作用。每个元素减去0的ASCII码值(即48)就可以转换成数字。
最后一些步骤就看上面的代码就行了。
在这里我得到教训就是模块化编程的重要性,如果把所有代码都写在main函数里,检查代码的时候就会头皮发麻。如果把每个函数的功能都分出来,整体上就会很整洁,也方便阅读检查代码。
大整数加法——求两个不超过200位的非负整数的和相关推荐
- 求两个不超过 200 位的非负整数的和(逐句解释)
求两个不超过 200 位的非负整数的和. 输入格式 有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0. 输出格式 一行,即相加后的结果.结果里不能有多余的前导 0,即如果结果是 3 ...
- 求两个不超过200位的非负整数积_必看:初一上册数学考试概念、定义全部公式总结!(两个版本)...
语文资料 数学资料 英语资料 政史地资料 物化生资料 高中资料 人教版 第一章有理数概念.定义: 1.大于0的数叫做正数(positive number). 2.在正数前面加上负号"-&qu ...
- Bailian2981 大整数加法【大数】(POJ NOI0106-10)
问题链接:POJ NOI0106-10 大整数加法. 大整数加法 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加 ...
- 算法总结——大整数加法
问题描述 求两个不超过200位的非负整数的和. 输入数据 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出要求 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是342, ...
- 信息学奥赛一本通:1168:大整数加法
1168:大整数加法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 76804 通过数: 25726 [题目描述] 求两个不超过200位的非负整数的和. ...
- 大整数加法【信息学奥赛一本通-1168】
1168:大整数加法 1168:大整数加法 [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. [输出] 一行,即相加后的结 ...
- 信息学奥赛一本通(1168:大整数加法)
1168:大整数加法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 44610 通过数: 14295 [题目描述] 求两个不超过200位的非负整数的和. ...
- 信息学奥赛一本通(c++):1168:大整数加法
一.题目 1168:大整数加法 时间限制: 1000 ms 内存限制: 65536 KB [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位 ...
- NOI OJ 1.6 10:大整数加法 C语言
描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是342,那么就不能 ...
最新文章
- WCF学习之旅—基于Fault Contract 的异常处理(十八)
- 网狐棋牌(十) 成也萧何败也肖何? IUnknowEx
- 有c基础学java多久_有c十十基础的自学java语言每天6小时要多长时间?
- java代码整合_java合并多个文件的实例代码
- springcloud 服务降级
- Jupyter Notebooks的安装和使用介绍
- CSS自学笔记(9):CSS拓展(二)
- 常用idea快捷键大全
- python函数的面向对象——面向对象设计
- 网管学习日记-浮动静态路由和负载均衡
- 最流行6种微服务RPC技术,你一定要知道
- 安科瑞ACTB-6互感器二次侧开路保护装置
- Android中获取系统所认为的最小滑动距离TouchSlop
- 蚂蚁的愤怒之源(落日余晖)-终结篇
- 去了字节跳动,才知道年薪40W的测试有这么多?
- 【Python】求笛卡尔乘积
- 2021-08-12:浏览器使用window.open 新页签被拦截的问题
- SpringBoot使用hutool生成图片二维码
- 【工作记录】支付系统数据库梳理
- ipxe u盘启动linux内核,iPXE的使用介绍
热门文章
- 1194C语言实验——余弦
- java.util.stream.Stream案例解读
- 2023学习Linux云计算可以做什么岗位的工作?
- 谷歌天气预报 API
- 十年Java面试官告诉你如何介绍自己的项目经验
- 修道士与野人问题——C++源代码,伪代码,详细分析
- 游戏中的弹道学手册(转)
- 数据库基础及查询语句
- 【★★★所有A42JV 和 K42JV的用户和未来用户联合起来~!!让华硕知道不能忽视我们~!】...
- 在计算机刚出现时如何解决问题,当grub出现在计算机上时,如何解决该问题?启动计算机后出现grub时该怎么办?...