C++实现大整数加法

C++实现大整数加法大整数加法可谓是学习 C 语言的一个里程碑 那么 如何在 C 简单易懂地实现大整数加法呢 nbsp 概念思路假定这两个十进制的大整数位数不超过 255 位 那么 可以定义两个长度为 255 的字符数组 num1 num2 以换行符作为分界线 依次读入 最后 从两个数组的最后一位开始 一位位地向前相加 进位 直到两个数组都被读完或一个数组被读完 此时 更长的一个数组剩下的数字直接输出 例

大整数加法可谓是学习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

将为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 
  
    #include 
   
     #include 
    
      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< 
      
     
    
  

思路:

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< 
  

 

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

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

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


相关推荐

  • 3.3v与5v电平转换_5v电压经过10位A/D转换

    3.3v与5v电平转换_5v电压经过10位A/D转换问题背景在设计一个带MCU或者ARM系统电路时候,经常遇见MCU的VCC是3.3V,但是外围电路需要5V,有时候是反过来。虽然现在MCU的IO都声称支持TTL电平,但是我们谁也不想将MCU的IO口直接接上5V,即使IO口先串联一个电阻,然后再接上5V,这样总是不放心,担心烧掉MCU。再说了,MCU声称IO口支持TTL电平,但是并不是所有的IO都是这样,反正有隐患。解决方法就是电平转换。具体的我只说我在实际项目中运用到的方法,而且在项目中运用比较方便的,其他的都不再说了。法一:基于门电路第一种:利用O

    2022年8月10日
    12
  • SplitContainer控件设置固定比例

    SplitContainer控件设置固定比例SplitContainer控件2个panel如何设置均等大小.(竖直拆分)先随意设置空间高的大小,然后如果想要均等显示,则直接设置SplitterDistance为高的一半,即可!随后任意改变控件大小,都不会改变均等显示比例。同理3:7,4:6…

    2022年7月18日
    15
  • Clawdbot 完整对接飞书教程 手把手搭建你的专属 AI 助手

    Clawdbot 完整对接飞书教程 手把手搭建你的专属 AI 助手

    2026年3月13日
    2
  • Android完美解析setContentView 你真的理解setContentView吗?「建议收藏」

    Android完美解析setContentView 你真的理解setContentView吗?「建议收藏」导读:本篇文章的前半部分为源码分析,后半部分为一个例子,在例子中我们会遇到一些问题,从而回答前半部分留下的问题!

    2022年6月26日
    24
  • MySQL索引实现原理分析

    目前大部分数据库系统及文件系统都采用B-Tree(B树)或其变种B+Tree(B+树)作为索引结构。B+Tree是数据库系统实现索引的首选数据结构。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。MyISAM索引实现MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的…

    2022年4月7日
    52
  • ubuntu 安装图形界面_ubuntu安装mpich详细教程

    ubuntu 安装图形界面_ubuntu安装mpich详细教程#cd/opt#sudowgethttps://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb#sudomvmsfupdate.erbmsfinstall#sudochmod755…

    2025年9月24日
    6

发表回复

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

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