问题描述

求两个不超过200位的非负整数的和。
输入数据
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出要求
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 
输入样例
22222222222222222222
33333333333333333333
输出样例
Output Sample:
55555555555555555555

解题思路

首先要解决的就是存储200位整数的问题。显然,任何C/C++固有类型的变量都无法保存它。最直观的想法是可以用一个字符串来保存它。字符串本质上就是一个字符数组,因此为了编程更方便,我们也可以用数组unsigned an[200]来保存一个200位的整数,让an[0]存放个位数,an[1]存放十位数,an[2]存放百位数……
那么如何实现两个大整数相加呢?方法很简单,就是模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10则进位。也就是说,用unsigned an1[201]保存第一个数,用unsigned an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1中。要注意处理进位。另外,an1数组长度定为201,是因为两个200位整数相加,结果可能会有201位。实际编程时,不一定要费心思去把数组大小定得正好合适,稍微开大点也无所谓,以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。

参考程序:

#include <stdio.h>
#include <string.h>
#define MAX_LEN 200
int an1[MAX_LEN+10];
int an2[MAX_LEN+10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];
int main()
{scanf("%s", szLine1);scanf("%s", szLine2);int i, j;//库函数memeset将地址an1开始的sizeof(an1)字节内容置成0//sizeof(an1)的值就是an1的长度//memset函数在string.h中声明memset( an1, 0, sizeof(an1));   memset( an2, 0, sizeof(an2));//下面将szLine1中存储的字符串形式的整数转换到an1中去,//an1[0]对应于个位int nLen1 = strlen( szLine1);j = 0;for( i = nLen1 - 1;i >= 0 ; i --)an1[j++] = szLine1[i] - '0';  int nLen2 = strlen(szLine2);j = 0;for( i = nLen2 - 1;i >= 0 ; i --)an2[j++] = szLine2[i] - '0';for( i = 0;i < MAX_LEN ; i ++ ) {  an1[i] += an2[i];     //逐位相加if( an1[i] >= 10 ) {      //看是否要进位    an1[i] -= 10;an1[i+1] ++;           //进位}}bool bStartOutput = false;   //此变量用于跳过多余的0for( i = MAX_LEN; i >= 0; i -- ) {if( bStartOutput)   printf("%d", an1[i]);  //如果多余的0已经都跳过,则输出   else if( an1[i] ) {     printf("%d", an1[i]);bStartOutput = true; //碰到第一个非0的值,就说明多余的0已经都跳过            }}//--------------------------------------------------------------------------------return 0;
}

实现技巧

1. 再次强调:实际编程时,不一定要费心思去把数组大小定得正好合适,稍微开大点也无所谓,以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
2. 语句25是把一个字符形式的数字转换成unsigned型的数。比如,要把字符’8’转换成unsigned型数8。char类型的变量,本质上实际是int类型,值就是字符的Ascii码。由于字符’0’到字符’9’的Ascii码是连续递增的,因此 ‘8’ – ‘0’ 的值就是8。

算法总结——大整数加法相关推荐

  1. 大整数加法计算思路与算法实现

    参加MOOC PKU的程序设计专项课程学习,目前进度到C++.这门课太烂了,完全就是自学,作业还相当难!!!!比如这里week4的这题,其实是把poj上的大整数的加.减.乘.除合并到一题里面,这个代码 ...

  2. 大整数加法(简单算法)

    大整数加法首先要了解加法的算法,具体思路很简单: 从低位到高位开始加,需要进位,正向数组是高位在前,所以需要反向数组开始加法. 代码如下,写的麻烦了一点: #include<stdio.h> ...

  3. 1.6编程基础之一维数组 10大整数加法

    1.6编程基础之一维数组 10大整数加法 OpenJudge - 10:大整数加法 1168:大整数加法 信息学奥赛一本通(C++版)在线评测系统 P1601 A+B Problem(高精) A+B ...

  4. openjudge 1.6.10 大整数加法

    OpenJudge - 10:大整数加法 解题思路: 1.大整数加法,对应的是高精度加法算法,利用数组模拟来解决 2.首先,明确long long范围都放不下的整数,我们应该想到用数组的方法,如果采取 ...

  5. 剑指offer第12题打印从1到n位数以及大整数加法乘法

    字符和数字加减就是字符的ASCII码和数字直接加减. 方法一: 1)在字符串操作中给一个整形数字加(字符0)就是把它转化为字符,当然给一个字符减去(字符0)就可以把它转化为数字了:如果确实是最后一位字 ...

  6. javascript乘法和加法_js 大整数加法、乘法、除法

    有一定的编程经验的人都知道,当我们对数据操作的时候,若数据过大,计算机将这个大数从十进制的转为二进制的,是没有那个类型的放的了的,因此,我们经常将一个大数转化为字符串来操作.接下来我将演示大整数的加法 ...

  7. 1168:大整数加法--2022.01.22 AC

    /* 1168:大整数加法--2022.01.22 AC http://ybt.ssoier.cn:8088/problem_show.php?pid=1168c++中 cin.cin.get().c ...

  8. 信息学奥赛一本通 1168:大整数加法 | OpenJudge NOI 1.6 10:大整数加法

    [题目链接] ybt 1168:大整数加法 OpenJudge NOI 1.6 10:大整数加法 [题目考点] 1. 高精度 考察:高精加高精 高精度计算讲解 [解题思路] 注意:输入可能有多余的前导 ...

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

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

最新文章

  1. MySQL导出到excle显示不了_mysql导出select语句结果到excel文件遇到问题及解决方法_MySQL...
  2. Android studio 使用SVN需要忽略的文件
  3. JavaScript实现希尔密码 算法(附完 整源码)
  4. php安全配置总结,php安全配置详细说明(1/2)_PHP教程
  5. 2018南京java工资_2018年Java开发工程师的待遇如何?
  6. 动态规划——坐标型位操作型
  7. formatter java_Java编程中的Java Formatter是什么?
  8. jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?
  9. php代码里加图片,php如何添加图片
  10. Linux环境下为普通用户添加sudo权限
  11. ListView练习_购物商城
  12. java 标识符_java标识符是什么
  13. 《从问题到程序:用Python学编程和计算》——2.6 简单脚本程序
  14. editthiscookie插件怎么安装_PPT插件——OK之安装篇
  15. c# String.Split数组省去空字符
  16. 工程实践线切割3B代码参考
  17. HSC-1th misc——DORAEMON
  18. 解决系统任务管理器已经被管理员停用
  19. 使用Nhibernate.Tool.Hbm2Net来根据HBML文件生成POJO类的代码
  20. 计算机网络-第1章-PPT

热门文章

  1. git常用命令之git push使用说明
  2. 沈阳市政府 第三方社会评估总体报告
  3. 盒子移动的问题,拖拽问题
  4. 拒绝服务攻击过程详解
  5. 【单片机】汇编指令入门学习|单片机启动代码汇编
  6. python异常-TypeError: ‘tuple‘ object is not callable.当不同的环境下同一个语句运行结果不同时,不如重启程序、更改不相关变量试试
  7. 网易云音乐ubuntu下安装
  8. mysql需要记住的单词_巧记单词——用like记住10个单词
  9. C语言 信号集回调函数 避免子进程在信号回调注册完成之前全部结束
  10. 线代【二次型】--猴博士爱讲课