算法总结——大整数加法

算法总结——大整数加法问题描述 nbsp 求两个不超过 200 位的非负整数的和 输入数据有两行 每行是一个不超过 200 位的非负整数 没有多余的前导 0 输出要求一行 即相加后的结果 结果里不能有多余的前导 0 即如果结果是 342 那么就不能输出为 0342 nbsp 输入样例输出样例 OutputSample

问题描述 

求两个不超过200位的非负整数的和。

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

输出样例
Output Sample:

解题思路

首先要解决的就是存储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 
                
                  #include 
                 
                   #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; //此变量用于跳过多余的0 for( 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。




























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177851.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:36
下一篇 2026年3月26日 下午6:37


相关推荐

  • 扫码登录的简单实现

    扫码登录的简单实现前言本文将介绍基于 SpringBoot Vue Android 实现的扫码登录 demo 的总体思路 完整代码已上传到 GitHub Web 端体验地址 http 47 116 72 33 只剩一个月有效期 apk 下载地址 https github com zhangjiwei12 qrscan releases tag 0 0 1 用户名 非空即可 密码 效果见文末 整体实现如有不妥之处 欢迎交流讨论 实现部分参考二维码扫码登录是什么原理 项目简介后端 SpringBoo

    2026年3月19日
    2
  • 生成对抗网络(GAN)教程 – 多图详解

    生成对抗网络(GAN)教程 – 多图详解一 生成对抗网络简介 1 生成对抗网络模型主要包括两部分 生成模型和判别模型 生成模型是指我们可以根据任务 通过模型训练由输入的数据生成文字 图像 视频等数据 1 比如 RNN 部分讲的用于生成奥巴马演讲稿的 RNN 模型 通过输入开头词就能生成下来 2 或者由有马赛克的图像通过模型变成清晰的图像 第一张是真实 第四张是合成的

    2026年3月18日
    2
  • 蓝桥杯单片机定时器1的编码以及数码管的动态显示

    蓝桥杯单片机定时器1的编码以及数码管的动态显示

    2021年11月12日
    43
  • vue刷新页面的方法_vue局部刷新页面

    vue刷新页面的方法_vue局部刷新页面业务需求/问题描述在项目中经常遇到一个问题,例如新增完表单数据和需要重新刷新页面。类似的业务还有很多。这时我们可以考虑的方式如下①(推荐)v-if刷新页面,并依赖注入(不太清楚的小伙伴可以看我之前的文章)//父组件<子组件v-if=’load’>exportdefault{ data(){ load=true }, methods:{ refresh(){ this.load=false this.$nextTick(()=>{ t

    2022年10月17日
    5
  • idea2016 3.2激活码破解方法

    idea2016 3.2激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    197
  • NER 综述

    NER 综述前两天刚做完毕设答辩 slide 最近浏览知乎的时候发现有人分享一篇 2020 年的 NER 综述 做下论文笔记 同时也分享一下自己的的想法 吐槽一句 知乎图片插入好麻烦 不能随心所欲的粘贴 论文 ASurveyonDee 链接 https arxiv org pdf 1812 09449 pdf 目前已被数据挖掘顶刊 TKDE 收录 先膜拜 目录全文简介 NER 任务简介 NER 标注语料库 公开评测集 o

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号