C++实现大整数加法
大整数加法可谓是学习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++实现大整数加法相关推荐
- 剑指offer第12题打印从1到n位数以及大整数加法乘法
字符和数字加减就是字符的ASCII码和数字直接加减. 方法一: 1)在字符串操作中给一个整形数字加(字符0)就是把它转化为字符,当然给一个字符减去(字符0)就可以把它转化为数字了:如果确实是最后一位字 ...
- javascript乘法和加法_js 大整数加法、乘法、除法
有一定的编程经验的人都知道,当我们对数据操作的时候,若数据过大,计算机将这个大数从十进制的转为二进制的,是没有那个类型的放的了的,因此,我们经常将一个大数转化为字符串来操作.接下来我将演示大整数的加法 ...
- 1168:大整数加法--2022.01.22 AC
/* 1168:大整数加法--2022.01.22 AC http://ybt.ssoier.cn:8088/problem_show.php?pid=1168c++中 cin.cin.get().c ...
- 信息学奥赛一本通 1168:大整数加法 | OpenJudge NOI 1.6 10:大整数加法
[题目链接] ybt 1168:大整数加法 OpenJudge NOI 1.6 10:大整数加法 [题目考点] 1. 高精度 考察:高精加高精 高精度计算讲解 [解题思路] 注意:输入可能有多余的前导 ...
- Bailian2981 大整数加法【大数】(POJ NOI0106-10)
问题链接:POJ NOI0106-10 大整数加法. 大整数加法 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加 ...
- 大整数加法基本思路和代码(C++实现)
大整数加法基本思路和代码(C++实现) 前言 分析 编程 前言 如果给出两个很大很大的整数,这两个数大到long类型也装不下,比如100位整数,如何求它们的和呢? Java中有无敌的BigIntege ...
- 信息学奥赛一本通:1168:大整数加法
1168:大整数加法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 76804 通过数: 25726 [题目描述] 求两个不超过200位的非负整数的和. ...
- 大整数加法——求两个不超过200位的非负整数的和
10:大整数加法 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是 ...
- 1.6编程基础之一维数组 10大整数加法
1.6编程基础之一维数组 10大整数加法 OpenJudge - 10:大整数加法 1168:大整数加法 信息学奥赛一本通(C++版)在线评测系统 P1601 A+B Problem(高精) A+B ...
- 大整数加法【信息学奥赛一本通-1168】
1168:大整数加法 1168:大整数加法 [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. [输出] 一行,即相加后的结 ...
最新文章
- 消灭 Java 代码的“坏味道”【转】
- Spring - Java/J2EE Application Framework 应用框架 第 18 章 使用Quartz或Timer完成时序调度工作
- java项目(注册和登录(成功后查看商品的信息))
- 守望者的逃离—贪心算法
- 关于MySQL出现`lock wait timeout exceeded; try restarting transaction` 的解决方案
- csvn(apache+svn)管理工具搭建
- python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI
- Macbook使用技巧,分享必备
- cocos2d环境及创建一个自己的项目
- php手机i选择图片多选,ios 相册图片多选 带预览功能
- xsehll不能删除字符的解决方案
- MATLAB 数据显示格式
- OpenGL--纹理贴图基础
- HP WebInspect 软件 简介
- unity源码怎么变成游戏_传奇是怎么从最不“烧钱”的游戏变成最“烧钱”的游戏的...
- 【Photoshop文字排版小技巧】
- win7系统如何开启蓝牙
- 蓝鲸智云平台部署[6.0.5]
- 深度学习-根据名字识别男女
- linux 实现监听热插拔事件
热门文章
- WIN7系统操作快捷键
- 手写数字识别c语言作业,10 行代码,实现手写数字识别
- html打印样式不生效,css – 打印样式:如何确保图像不跨越分页符
- MyBatis、IDEA控制台乱码
- MathType固定行距时符号显示不全
- 鸿蒙os将用在哪款机型,4月份正式开始,鸿蒙OS即将推送,14款荣耀机型在列,感动...
- Twitter开源软件列表
- cocos2dx跨平台直播实例-ffmpeg-ios篇
- Windows10中如何使用ADSL不固定IP地址连接因特网
- 32位算术逻辑运算单元alu设计_64位的电脑比32位的电脑跑的快么?多图预警