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位的非负整数的和相关推荐

  1. 求两个不超过 200 位的非负整数的和(逐句解释)

    求两个不超过 200 位的非负整数的和. 输入格式 有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0. 输出格式 一行,即相加后的结果.结果里不能有多余的前导 0,即如果结果是 3 ...

  2. 求两个不超过200位的非负整数积_必看:初一上册数学考试概念、定义全部公式总结!(两个版本)...

    语文资料 数学资料 英语资料 政史地资料 物化生资料 高中资料 人教版 第一章有理数概念.定义: 1.大于0的数叫做正数(positive number). 2.在正数前面加上负号"-&qu ...

  3. Bailian2981 大整数加法【大数】(POJ NOI0106-10)

    问题链接:POJ NOI0106-10 大整数加法. 大整数加法 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加 ...

  4. 算法总结——大整数加法

    问题描述 求两个不超过200位的非负整数的和. 输入数据 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出要求 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是342, ...

  5. 信息学奥赛一本通:1168:大整数加法

    1168:大整数加法 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 76804     通过数: 25726 [题目描述] 求两个不超过200位的非负整数的和. ...

  6. 大整数加法【信息学奥赛一本通-1168】

    1168:大整数加法 1168:大整数加法 [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. [输出] 一行,即相加后的结 ...

  7. 信息学奥赛一本通(1168:大整数加法)

    1168:大整数加法 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 44610     通过数: 14295 [题目描述] 求两个不超过200位的非负整数的和. ...

  8. 信息学奥赛一本通(c++):1168:大整数加法

    一.题目 1168:大整数加法 时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位 ...

  9. NOI OJ 1.6 10:大整数加法 C语言

    描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是342,那么就不能 ...

最新文章

  1. WCF学习之旅—基于Fault Contract 的异常处理(十八)
  2. 网狐棋牌(十) 成也萧何败也肖何? IUnknowEx
  3. 有c基础学java多久_有c十十基础的自学java语言每天6小时要多长时间?
  4. java代码整合_java合并多个文件的实例代码
  5. springcloud 服务降级
  6. Jupyter Notebooks的安装和使用介绍
  7. CSS自学笔记(9):CSS拓展(二)
  8. 常用idea快捷键大全
  9. python函数的面向对象——面向对象设计
  10. 网管学习日记-浮动静态路由和负载均衡
  11. 最流行6种微服务RPC技术,你一定要知道
  12. 安科瑞ACTB-6互感器二次侧开路保护装置
  13. Android中获取系统所认为的最小滑动距离TouchSlop
  14. 蚂蚁的愤怒之源(落日余晖)-终结篇
  15. 去了字节跳动,才知道年薪40W的测试有这么多?
  16. 【Python】求笛卡尔乘积
  17. 2021-08-12:浏览器使用window.open 新页签被拦截的问题
  18. SpringBoot使用hutool生成图片二维码
  19. 【工作记录】支付系统数据库梳理
  20. ipxe u盘启动linux内核,iPXE的使用介绍

热门文章

  1. 1194C语言实验——余弦
  2. java.util.stream.Stream案例解读
  3. 2023学习Linux云计算可以做什么岗位的工作?
  4. 谷歌天气预报 API
  5. 十年Java面试官告诉你如何介绍自己的项目经验
  6. 修道士与野人问题——C++源代码,伪代码,详细分析
  7. 游戏中的弹道学手册(转)
  8. 数据库基础及查询语句
  9. 【★★★所有A42JV 和 K42JV的用户和未来用户联合起来~!!让华硕知道不能忽视我们~!】...
  10. 在计算机刚出现时如何解决问题,当grub出现在计算机上时,如何解决该问题?启动计算机后出现grub时该怎么办?...