大数加法(C++实现)

2023-11-14

最常规的大数加法 (两个数都是非负的整数)

 

思路:

用字符串的方式去存储我们需要计算的数 ,但是要注意的一点就是我们是倒过来存储这个大数的

比如: 123456789 我们存储的时候是存成  987654321

为什么要这么干? 我觉得是为了便于后面我们的进位操作吧 

 

最常规的大数加法 (两个数都是非负的整数)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int L=110;
 6 string add(string a,string b)//只限两个非负整数相加
 7 {
 8     string ans;
 9     int na[L]={0},nb[L]={0};
10     int la=a.size();
11     int lb=b.size();
12     // 倒叙存储
13     for(int i=0;i<la;i++)
14         na[la-1-i]=a[i]-'0';
15     // 倒叙存储
16     for(int i=0;i<lb;i++) 
17         nb[lb-1-i]=b[i]-'0';
18     int lmax=la>lb?la:lb;
19     // 从个位开始计算
20     for(int i=0;i<lmax;i++) 
21     {
22         na[i]+=nb[i];
23         na[i+1]+=na[i]/10;
24         na[i]%=10;
25     }
26     // 去除前置0
27     if(!na[lmax]) 
28         lmax--;  
29     for(int i=lmax;i>=0;i--) 
30         ans+=na[i]+'0';
31     return ans;
32 }
33 int main()
34 {
35     string a,b;
36     while(cin>>a>>b)
37         cout<<add(a,b)<<endl;
38     return 0;
39 }

 

【变形一】 正负整数的大数的加法

 

思路:

大体的思路和常规的大数加法还是一样的,唯一不同的就是多了对最后结果的判断(是正数还是负数)

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include <iostream>
  5 #include <cstring>
  6 
  7 using namespace std;
  8 
  9 const int maxn = 10010;
 10 
 11 char a[maxn],b[maxn];
 12 int aa[maxn],bb[maxn];
 13 
 14 
 15 void add(char str1[],char str2[])
 16 {
 17     memset(aa,0, sizeof(aa));
 18     memset(bb,0, sizeof(bb));
 19     int len1 = strlen(str1);
 20     int len2 = strlen(str2);
 21     int flag1 = 0,flag2 = 0;
 22     // 都是0的时候特殊处理
 23     if (str1[0] == '0' && str2[0] == '0')
 24         printf("0\n");
 25     else
 26     {
 27         // str1是负数
 28         if (str1[0] == '-')
 29         {
 30             flag1 = 1;
 31             for (int i=0;i<len1-1;i++)
 32             {
 33                 aa[i] = str1[len1-1-i] - '0'; //倒叙记录
 34             }
 35         }
 36         else
 37         {
 38             // str1是正数
 39             for (int i=0;i<len1;i++)
 40             {
 41                 aa[i] = str1[len1-1-i] -'0';
 42             }
 43         }
 44 
 45         //str2是负数
 46         if (str2[0] == '-')
 47         {
 48             flag2 = 1;
 49             for (int i=0;i<len2-1;i++)
 50             {
 51                 bb[i] = str2[len2-1-i] - '0';
 52             }
 53         }
 54         else
 55         {
 56             // str2是正数
 57             for (int i=0;i<len2;i++)
 58             {
 59                 bb[i] = str2[len2-1-i]- '0';
 60             }
 61         }
 62 
 63     //分四种情况对str1,str2处理
 64 
 65     if (!flag1 && !flag2) //str1 和 str2都是正数
 66     {
 67         int len = max(len1,len2);
 68         for (int i=0;i<len;i++)
 69         {
 70             bb[i] += aa[i];
 71             bb[i+1] += bb[i]/10;
 72             bb[i]%=10;
 73         }
 74         //处理前置零
 75         while (!bb[len])
 76             len--;
 77         for (;len>=0;len--)
 78             printf("%d",bb[len]);
 79         printf("\n");
 80     }
 81     else if (!flag1 && flag2) // str1是正数,str2是负数
 82     {
 83         int ans = 0;
 84         //判断str1和str2的绝对值谁大谁小
 85         if (len1>len2-1)
 86             ans = 1;
 87         else if (len1 == len2-1)
 88         {
 89             for (int i=len1-1;i>=0;i--)
 90             {
 91                 if (aa[i]>bb[i])
 92                 {
 93                     ans = 1;
 94                     break;
 95                 }
 96                 else if (aa[i]<bb[i])
 97                 {
 98                     ans = 0;
 99                     break;
100                 }
101             }
102         }
103         // 如果str1的绝对值更大
104         if (ans)
105         {
106             for (int i=0;i<len1;i++)
107             {
108                 aa[i] -= bb[i];
109                 while (aa[i]<0)
110                 {
111                     aa[i] += 10;
112                     aa[i+1]--;
113                 }
114             }
115             //处理前置零
116             while (!aa[len1])
117                 len1--;
118             for (;len1>=0;len1--)
119                 printf("%d",aa[len1]);
120             printf("\n");
121         }
122         else  // 如果str2的绝对值更大
123         {
124             for (int i=0;i<len2-1;i++)
125             {
126                 bb[i] -= aa[i];
127                 while (bb[i]<0)
128                 {
129                     bb[i]+=10;
130                     bb[i+1]--;
131                 }
132             }
133             //处理前置零
134             while (!bb[len2])
135                 len2--;
136             if (len2<0)    // 注意333  -333 的情况
137                 printf("0\n");
138             else
139             {
140                 for (;len2>=0;len2--)
141                     printf("%d",bb[len2]);
142                 printf("\n");
143             }
144         }
145     }
146     else if (flag1 && !flag2) //str1为负数 str2为正数
147     {
148         int ans = 0;
149         // 判断str1 和 str2 的绝对值的大小
150         if (len2>len1-1)
151         {
152             ans = 1;
153         }
154         else if (len2 == len1-1)
155         {
156             for (int i = len2 - 1; i >= 0; i--)
157             {
158                 if (aa[i] > bb[i])
159                 {
160                     ans = 0;
161                     break;
162                 }
163                 else if (bb[i] > aa[i])
164                 {
165                     ans = 1;
166                     break;
167                 }
168             }
169         }
170         //判断结果的正负
171         if (ans)
172         {
173             for (int i=0;i<len2;i++)
174             {
175                 bb[i] -= aa[i];
176                 while (bb[i]<0)
177                 {
178                     bb[i]+=10;
179                     bb[i+1]--;
180                 }
181             }
182             //处理前置0
183             while (!bb[len2])
184                 len2--;
185             for (;len2>=0;len2--)
186                 printf("%d",bb[len2]);
187             printf("\n");
188         }
189         else
190         {
191             for (int i=0;i<len1-1;i++)
192             {
193                 aa[i] -= bb[i];
194                 while (aa[i]<0)
195                 {
196                     aa[i]+=10;
197                     aa[i+1]--;
198                 }
199             }
200             //处理前置0
201             while (!aa[len1])
202                 len1--;
203             if (len1<0)        // 注意333 -333 的情况
204                 printf("0\n");
205             else
206             {
207                 printf("-");
208                 for (;len1>=0;len1--)
209                 {
210                     printf("%d",aa[len1]);
211                 }
212                 printf("\n");
213             }
214         }
215     }
216     else if (flag1 && flag2) // 都是负数
217     {
218         printf("-");
219         int len = max(len1,len2);
220         for (int i=0;i<len-1;i++)
221         {
222             bb[i] += aa[i];
223             bb[i+1] += bb[i]/10;
224             bb[i]%=10;
225         }
226         while (!bb[len])
227             len--;
228         for (;len>=0;len--)
229             printf("%d",bb[len]);
230         printf("\n");
231     }
232     }
233 }
234 
235 
236 
237 
238 
239 int main()
240 {
241     while (cin >> a >> b)
242     {
243         add(a,b);
244     }
245     return 0;
246 }

 

【变形二】正小数的大数加法

 

思路:我们把小数部分和整数部分分开来考虑

 

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include <iostream>
  5 #include <cstring>
  6 
  7 using namespace std;
  8 
  9 int len,len1,len2,i,j,k,x1,x2,y1,y2,m,n;
 10 char str1[450],str2[450];
 11 int a1[450],a2[450],a3[450],b1[450],b2[450],b3[450],a[450],b[450],c[450];
 12 
 13 
 14 void add(char str1[],char str2[])
 15 {
 16     memset(a1,0, sizeof(a1));
 17     memset(a2,0, sizeof(a2));
 18     memset(a3,0, sizeof(a3));
 19     memset(b1,0, sizeof(b1));
 20     memset(b2,0, sizeof(b2));
 21     memset(b3,0, sizeof(b3));
 22     memset(a,0, sizeof(a));
 23     memset(b,0, sizeof(b));
 24     memset(c,0, sizeof(c));
 25     len1 = strlen(str1);
 26     len2 = strlen(str2);
 27     //找到str1小数点
 28     for (i=0;i<len1;i++)
 29     {
 30         if (str1[i] == '.')
 31             break;
 32     }
 33     //存储str1小数部分
 34     for (k=len1-1,j=0;k>i;k--,j++)
 35     {
 36         a1[j] = str1[k] -'0';
 37     }
 38     x1 = j; //记录a1的长度(小数部分)
 39     i = i - 1;
 40     //存储str2整数部分
 41     for (j=0;i>=0;i--,j++)
 42     {
 43         a2[j] = str1[i] - '0';
 44     }
 45     x2 = j; //记录a2数组的长度(整数部分)
 46 
 47     //找到str1的小数点
 48     for (i=0;i<len2;i++)
 49     {
 50         if (str2[i] == '.')
 51             break;
 52     }
 53     //存储str2小数部分
 54     for (k=len2-1,j=0;k>i;k--,j++)
 55     {
 56         b1[j] = str2[k]-'0';
 57     }
 58     y1 = j; //记录b1的长度(str2的小数部分)
 59     i = i - 1;
 60     // 存储str2的整数部分
 61     for (j=0;i>=0;i--,j++)
 62     {
 63         b2[j] = str2[i] - '0';
 64     }
 65     y2 = j; //记录b2的长度(str2的整数部分)
 66 
 67     // 对齐小数部分
 68     if (x1<=y1)
 69     {
 70         m = y1 - x1;
 71         n = y1;
 72         for (i = 0; i < x1; i++)
 73         {
 74             a3[i + m] = a1[i];
 75         }
 76         for (i = 0; i < y1; i++)
 77         {
 78             b3[i] = b1[i];
 79         }
 80     }
 81     else
 82     {
 83         m = x1 - y1;
 84         n = x1;
 85         for (i = 0; i < y1; i++)
 86         {
 87             b3[i+m] = b1[i];
 88         }
 89         for (i=0;i < x1;i++)
 90         {
 91             a3[i] = a1[i];
 92         }
 93     }
 94 
 95     //计算小数部分
 96     for (i=0;i<n;i++)
 97     {
 98         b[i] += a3[i]+b3[i];
 99         b[i+1] += b[i]/10;
100         b[i] = b[i]%10;
101     }
102     //第一位的小数需要进位
103     if (b[n] == 1)
104     {
105         a2[0]+=1;
106         b[n]=0;
107     }
108 
109     //计算整数部分
110     if (x2>=y2)
111         m=x2;
112     else
113         m=y2;
114     for (i=0;i<m;i++)
115     {
116         a[i]+=b2[i]+a2[i];
117         a[i+1]+=a[i]/10;
118         a[i]%=10;
119     }
120 
121     //处理整数的前置0
122     for (i=m+5;i>=0&&a[i]==0;i--)
123     {
124          ;
125     }
126     //存在不为0的部分
127     if (i>=0)
128     {
129         for (;i>=0;i--)
130             printf("%d",a[i]);
131     }
132     else //整数部分是0
133     {
134         printf("0");
135     }
136 
137     //处理小数的后置0
138     k = 0;
139     for (k=0;k<n&&b[k]==0;k++)
140     {
141         ;
142     }
143     //如果第n-1个还是0,那么则说明小数部分不存在
144     if (k!=n)
145     {
146         printf(".");
147         for (int i=n-1;i>=k;i--)
148         {
149             printf("%d",b[i]);
150         }
151     }
152     printf("\n");
153 }
154 
155 
156 
157 
158 
159 int main()
160 {
161     while (cin >> str1 >> str2)
162     {
163         add(str1,str2);
164     }
165     return 0;
166 }

 

转载于:https://www.cnblogs.com/-Ackerman/p/11191566.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数加法(C++实现) 的相关文章

  • Unity3D项目输出到iOS设备体验

    很久以前就听说过这个软件个了 当时觉得有cocos2d就够用了 开发一般的手机游戏应该不成问题了 后来还学习了一下cocos3d 最近突然想看一下这个传说中的Unity3D 安装上之后 里边自带有一个demo 点了一下播放按键 发现这个de
  • 半监督结点分类

    3 半监督结点分类 我们已经介绍过了一个简单但是灵活的可在图上进行有效信息传播的模型f X A 现在我们可以回过头来看半监督结点分类的问题了 就像本文的介绍中所简要概述的那样 我们可以通过在数据集X和基础图结构的邻接矩阵A上调整来我们的模型
  • netty权威指南学习笔记二——netty入门应用

    经过了前面的NIO基础知识准备 我们已经对NIO有了较大了解 现在就进入netty的实际应用中来看看吧 重点体会整个过程 按照权威指南写程序的过程中 发现一些问题 当我们在定义handler继承ChannelHanderAdapter时候
  • linux脚本

    程序后台运行 nohup java jar xxx jar gt hello log 后台运行java jar命令 并且将日志输出到hello log文件 防火墙 开启防火墙 systemctl start firewalld 开放指定端口
  • 子组件多次复用且传参到父组件时遇到的一些问题。

    问题描述 我们都知道 父子组件之间传参用props 子向父用 emit 兄弟间有bus 但是今天遇到个问题 A组件是一个selector选择器小组件 根据传参不同选择项目也不同 返回结果也不同 B组件中使用了4次A组件 传参都不一样 且需要
  • H5页面中添加微信公众号关注链接

    用下面地址做个链接 点击就会跳转到公众号关注页面 点击关注按钮 就能直接关注 https mp weixin qq com mp profile ext action home biz 替换公众号uin base6 wechat redir
  • CH10-图形图像处理

    目标 掌握常用绘图类的使用 能够绘制不同的图形 掌握Matrix类的使用方式 能够实现为图片添加特效的功能 掌握动画的使用 能够实现补间动画与逐帧动画的效果 图形图像在Android应用中会经常用到 如一些程序的图标 界面的美化等都离不开图
  • 2020 年度最佳的23个机器学习项目!(附源代码)

    关注后 星标 Datawhale 每日干货 每月组队学习 不错过 Datawhale干货 来源 大数据文摘 整理 数据派THU 本文约5300字 建议阅读10分钟 本文为你介绍23种机器学习项目创意 以获取有关该增长技术的真实经验 我们都知
  • 憨批的语义分割1——基于Mobile模型的segnet讲解

    憨批的语义分割1 基于Mobile模型的segnet讲解 学习前言 什么是Segnet模型 segnet模型的代码实现 1 主干模型Mobilenet 2 segnet的Decoder解码部分 代码测试 学习前言 最近开始设计新的领域啦 语
  • Apollo配置中心之配置获取方式

    apollo是携程开源的一款配置管理服务 开源地址https github com ctripcorp apollo apollo配置获取说明文档 https github com ctripcorp apollo wiki Java E5
  • Linux-VMware常用设置(时间+网络)及网络连接激活失败解决方法-基础篇②

    目录 一 设置时间 二 网络设置 1 激活网卡 方法一 直接启动网卡 仅限当此 方法二 修改配置文件 永久 2 将NAT模式改为桥接模式 什么是是NAT模式 如何改为桥接模式 三 虚拟机网络连接激活失败解决方法 第零步 确保Windows本
  • 同步串口和异步串口的区别及使用情况

    同步串口和异步串口的区别及使用情况 所谓同步就是等读写操作完了才返回 异步就是一调用马上返回 会有专门的线程进行读写操作 读写完了会通知的 一个会等待完成 一个不会 前者是同步 后者是异步 在计算机系统中 CPU和外部通信有两种通信方式 并
  • WebRTC 学习笔记(5)--线程模型

    1 基本线程 webrtc中主要有两个线程 signaling thread gt 处理小工作量方法 要求此线程内的方法都必须快速返回 worker thread gt 处理大工作量的方法 此线程内的方法可能会处理很长时间 如网络消息等 2
  • 加壳的app分析dex(可以正常抓包的话)

    简介 使用的是 https github com hluwa frida dexdump 安装 pip3 install frida dexdump 分析 这一步可以在window上看 使用查壳工具发现该apk使用的是360加固 两种脱de
  • JAVA宝典----字符串与数组(理解记忆)

    目录 一 字符串创建与存储的机制是什么 二 对于String类型的变量s 赋值语句s null与s 是否相同 三 equals和hashCode有什么区别 五 Java中数组是不是对象 六 数组的初始化方式有哪几种 一 字符串创建与存储的机
  • 微信小程序3,数据绑定,列表渲染,条件渲染

    目录 数据绑定 简单绑定 内容 组件属性 需要在双引号之内 控制属性 需要在双引号之内 关键字 需要在双引号之内 运算 三元运算 算数运算 逻辑判断 字符串运算 数据路径运算 组合 数组 对象 列表渲染 条件渲染 wx if block w
  • word2vec+textcnn

    word2vec textcnn 参考自 https www jianshu com p f69e8a306862
  • C++读取硬盘物理序列号-非管理员权限

    include stdafx h include
  • 如何判断一个对象中是否拥有某个属性?

    对象 var testDemo new TestDemo 判断对象testDemo是否拥有指定的name属性 1 使用in关键字 console log name in testDemo 使用这个方法不仅检查到自有属性 并且同时检查当前对象
  • 流程挖掘技术在内审与风控领域的应用实践

    内部审计作为企业监督体系的重要组成部分 在信息技术高速发展的大背景下 由于内部审计对象的信息化 数字化 也使得内部审计理念和方法 技术的信息化和数字化创新成为当务之急 而流程挖掘可以从根本上改变企业分析流程和执行风险控制的方式 通过前沿的风

随机推荐

  • 计算机网络---非归零码、曼彻斯特编码和差分曼彻斯特编码

    题目 在数据通信技术中 将利用模拟信道通过调制解调器传输模拟信号的方法称为频带传输 将利用数字信道直接传输数字信号的方法称为基带传输 基带传输中 数字信号的编码方式主要有三种 非归零码 曼彻斯特编码 差分曼彻斯特编码 非归零码 低电平 负电
  • UE4 解决当角色走到一个物体上时会被弹开的问题

    检查被踩物体的碰撞组件Collision那一栏的CanCharacterStepOn是否是Yes 如果不是请更改之 如果没效那就是其他的碰撞问题
  • leetcode 1035. 不相交的线

    2023 8 25 本题可以转化为 求两数组的最长公共子序列 进而可以用dp算法解决 方法类似于这题最长公共子序列 代码如下 class Solution public int maxUncrossedLines vector
  • 关于nltk安装出现的问题!渣渣版

    1 直接在cmd端输入 gt gt gt pip install nltk gt gt gt nltk download 2 在查阅了csdn各种博客后 我到 https github com nltk nltk data 官网上点击Clo
  • stm32 keil实现在线调试ram程序方法

    一 配置步骤 1 在main函数前面添加中断向量表偏移 如keil魔术棒中IROM1设置的是0x24001000 这在主函数前面需偏移到这个地址 可以使用图中函数 也可以直接操作 SCB gt VTOR 0x24001000 后面的值是你存
  • wsl2 拒绝访问(windows10 升级 windows 11 后) 问题解决

    1 临时解决方案 windows 防火墙关闭后重启电脑可访问 2 解决方案 控制面板 程序 启动或关闭windows功能 开启 Hyper v 重启 关闭 适用于Linux的windows子系统 重启 开启 适用于Linux的windows
  • Linux查看用户登陆历史记录(last命令的使用)

    查看某用户的操作历史 cat home username bash history 使用root登陆使用last x可查看用户登陆历史 last 命令 功能说明 列出目前与过去登入系统的用户相关信息 语 法 last adRx f n 帐号
  • python基础知识—集合

    集合 集合与列表 元组类似 可以存储多个数据 但是这些数据是不重复的 具有自动去重功能 集合的格式 变量名 元素1 元素2 元素3 变量 set 可迭代的内容 可迭代内容 gt list str 元组 字典 一 创建集合 1 set1 Tr
  • Win10和Jetson Nano环境下安装Mediapipe-python

    最近因学习需要用到google的mediapipe包进行手部识别 效果不错便想将其移植到jetson nano的ubuntu系统上 坑不少 在这里记录一下过程 步骤 一 Windows10的安装方法 二 Jetson Nano下的安装方法
  • Tomcat无法自动解压缩webapps下的war包

    Tomcat无法自动解压缩webapps下的war包 1 正常描述 把打好的war包放入tomcat gt webapps中 启动tomcat即可自动解压缩war包 然后即可访问 2 问题描述 启动tomcat 可以访问localhost
  • JavaScript引用数据类型之基本包装类型Boolean、Number、String

    JavaScript引用数据类型之基本包装类型 1 Boolean var falseObj new Boolean false 创建Boolean对象 var falseValue false console log typeof fal
  • 【MySQL】sql_mode 模式

    目录 前言 查看 sql mode 方式 查看当前会话的 sql mode 查看全局的 sql mode sql mode 配置属性 ONLY FULL GROUP BY STRICT TRANS TABLES STRICT ALL TAB
  • 一个中年程序员的10年测试人生,进阶测试专家必备5项技能!

    测试架构师成长线路图 第一步 成为互联网时代合格的测试工程师 如果你是入行不满3年的测试工程师 一定对此有迫切需求 此时 你必须迅速掌握被测软件的业务功能与内部架构 并在此基础上运用各种测试方法 尽可能多地发现潜在缺陷 并能够在已知缺陷的基
  • 无符号数 有符号数 与 补码

    无符号数 有符号数 与 补码 本文是深入理解计算机系统这本书里面关于补码有符号数无符号数章节的一个摘要和读书报告 我个人认为这本书关于这一段的表述 要比绝大多数网上的博客甚至是国内教材要深入浅出的多 同时由于markdown的文档表示公式很
  • vue中的动态路由怎么配置

    如何定义动态路由 如何获取传过来的动态参数 一 param方式 配置路由格式 router id 传递的方式 在path后面跟上对应的值 传递后形成的路径 router 123 1 定义路由 在APp vue中
  • 2.2.1 数据结构——矩阵结构、数组结构与数据框

    创建矩阵的函数名为 matrix 其基本语法格式为 matrix data NA nrow 1 ncol 1 byrow TRUE 其中data表示矩阵的元素 nrow和ncol分别表示了矩阵的行数和列数 byrow TRUE表示按行填充
  • Java:Spring、Java、MyBatis常用注解

    Spring 给容器IOC中注入组件 控制层 Controller 业务层 Service 数据访问层 Repository 通用 Component 泛指各种组件 Controller Service Repository都可以称为 Co
  • 第2章 核心技术概览

    运用之妙夺造化 存乎一心胜天工 有人可能会遇到这样的问题 跨境商贸合作中签订的合同 怎么确保对方能严格遵守和及时执行 酒店宣称刚打捞上来的三文鱼 怎么追踪捕捞和运输过程中的时间和卫生 现代数字世界里 怎么证明你是谁 怎么证明某个资产属于你
  • 基于直方图优化的图像增强技术(MATLAB实现)

    前言 直方图均衡是一种图像增强的常用手段 但全局直方均衡经常会给图像带来失真等问题 为了处理相关问题 本文采取了全局直方均衡 局部直方均衡和Retinex算法来对图像进行处理 主函数 img imread img tif In1 Remov
  • 大数加法(C++实现)

    最常规的大数加法 两个数都是非负的整数 思路 用字符串的方式去存储我们需要计算的数 但是要注意的一点就是我们是倒过来存储这个大数的 比如 123456789 我们存储的时候是存成 987654321 为什么要这么干 我觉得是为了便于后面我们