大整数加法可谓是学习C++语言的一个里程碑。那么,如何在C++简单易懂地实现大整数加法呢?

概念思路

假定这两个十进制的大整数位数不超过255位。

那么,可以定义两个长度为255的字符数组(num1,num2),以换行符作为分界线,依次读入。

最后,从两个数组的最后一位开始,一位位地向前相加,进位,直到两个数组都被读完或一个数组被读完(此时,更长的一个数组剩下的数字直接输出)。

例如:

num1[5]={'1','2','3','4','5'};

num2[5]={'2','3','4','5','6'};

定义减数i=0,while(i<=strlen(num1)&&i<=strlen(num2))时,对[长度-i-1]所对应的那一个数字进行操作。

如果,两数长度不一的话:

num1[5]={'1','2','3','4','5'};

num2[2]={'5','6'};

那么在i=3的时候,i<strlen(num2)将为false,跳出循环。

字符的相加

先来了解一下二字符相加的结果(ASCII码,已知者可跳过)。

不仅是在C++中,每个字符在ASCII下都对应着一个数字。比如说,97表示'a',65表示'A',48表示'0'。

在本例中,用到的是字符'0'-'9',对应的数字也就是48-57。

若有两个字符a和b,a='0',b='0',

那么,a+b返回的结果就是48+48=96(因为'0'是48)。若想使结果的ASCII总和就是数字之和,那么显而易见,应该再减去96。

在这个操作后,

'9'+'0'=57+48=105,减去96就是9,即9+0;

'4'+'4'=52+52=104,减去96就是8,即4+4。

至于进位,'9'+'9'=57+57=114,减去96就是18,即9+9,此时应检测到总和大于9,应保留总和-10(8),并向前进一位。

那么,可以实现在一个函数里:

int plusn(char a,char b)
{return int(a+b-96);}

简单吧?

字符串的读入

经过专业的cin输入流读入和puts(char[])的检测,发现cin是可以直接输入字符串的。

即:

char num1[255]={'\0'},num2[255]={'\0'};
cin>>num1>>num2;

没毛病。

代码初步实现

//作者:翼城朝雨;未经授权,请勿复制!
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char number1[255]={'0'},number2[255]={'0'};
int sum[255]={0},i=1;
int plusn(char a,char b)
{return int(a+b-96);
}
int main()
{cin>>number1>>number2;//输入数组int len1=strlen(number1),len2=strlen(number2);while(i<=min(len1,len2)){sum[255-i]+=plusn(number1[len1-i],number2[len2-i]);if(sum[255-i]>=10){sum[254-i]++;sum[255-i]-=10;}i++;}if(i<=len1){while(i<=len1){sum[255-i]+=number1[len1-i]-48;if(sum[255-i]>=10){sum[254-i]++;sum[255-i]-=10;}i++;}}else if(i<=len2){while(i<=len2){sum[255-i]+=number2[len2-i]-48;if(sum[255-i]>=10){sum[254-i]++;sum[255-i]-=10;}i++;}}while(i>1){i--;cout<<sum[255-i];}return 0;
}

思路:

1.输入2个字符串

2.从后向前逐位相加

3.检测:两数是否位数不同,若有,则将长的一个数字剩下的数直接调入sum[]数组

4.倒过来逐位输出

编译测试结果:

有问题。经典型例子检测,发现需要特别考虑输入为"1"和"01"(输出为"02",有前导0)

代码修改1

修改目标:

进行前导0检测

修改思路:

建立变量q,赋初值0;

输出的时候,检测到非0的数字,q=1,允许接下来输出。

可以把它理解成输出闸门,q=0时闸门关闭,q=1时闸门开启。

代码实现:

while(i>1){i--;if(sum[255-i]!=0&&q==0)q=1;if(q==1)cout<<sum[255-i];}

C++实现大整数加法相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 大整数加法基本思路和代码(C++实现)

    大整数加法基本思路和代码(C++实现) 前言 分析 编程 前言 如果给出两个很大很大的整数,这两个数大到long类型也装不下,比如100位整数,如何求它们的和呢? Java中有无敌的BigIntege ...

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

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

  8. 大整数加法——求两个不超过200位的非负整数的和

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

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

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

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

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

最新文章

  1. 消灭 Java 代码的“坏味道”【转】
  2. Spring - Java/J2EE Application Framework 应用框架 第 18 章 使用Quartz或Timer完成时序调度工作
  3. java项目(注册和登录(成功后查看商品的信息))
  4. 守望者的逃离—贪心算法
  5. 关于MySQL出现`lock wait timeout exceeded; try restarting transaction` 的解决方案
  6. csvn(apache+svn)管理工具搭建
  7. python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI
  8. Macbook使用技巧,分享必备
  9. cocos2d环境及创建一个自己的项目
  10. php手机i选择图片多选,ios 相册图片多选 带预览功能
  11. xsehll不能删除字符的解决方案
  12. MATLAB 数据显示格式
  13. OpenGL--纹理贴图基础
  14. HP WebInspect 软件 简介
  15. unity源码怎么变成游戏_传奇是怎么从最不“烧钱”的游戏变成最“烧钱”的游戏的...
  16. 【Photoshop文字排版小技巧】
  17. win7系统如何开启蓝牙
  18. 蓝鲸智云平台部署[6.0.5]
  19. 深度学习-根据名字识别男女
  20. linux 实现监听热插拔事件

热门文章

  1. WIN7系统操作快捷键
  2. 手写数字识别c语言作业,10 行代码,实现手写数字识别
  3. html打印样式不生效,css – 打印样式:如何确保图像不跨越分页符
  4. MyBatis、IDEA控制台乱码
  5. MathType固定行距时符号显示不全
  6. 鸿蒙os将用在哪款机型,4月份正式开始,鸿蒙OS即将推送,14款荣耀机型在列,感动...
  7. Twitter开源软件列表
  8. cocos2dx跨平台直播实例-ffmpeg-ios篇
  9. Windows10中如何使用ADSL不固定IP地址连接因特网
  10. 32位算术逻辑运算单元alu设计_64位的电脑比32位的电脑跑的快么?多图预警