原创 C语言 超大数相加

2019-3-12 22:48 1144 5 3 分类: MCU/ 嵌入式 文集: C语言
source:https://blog.csdn.net/rtduq/article/details/79954816
大数指的是超过系统能处理的最大整数,比如32位系统int类型最大值是2147483647,但实际情况中我们需要处理的数据可能是20位、50位、100位,所以一般使用字符串而不是整型数来做运算,这里做的是最简单的加法,由加法我们后面可以扩展到减法、乘法、除法等。
#include "stdafx.h"
#include "stdio.h"
#include "string.h"

//1位加法,f表示进位
int addchar(char c1,char c2,int f,char &s){
int t=c1+c2+f;
if(t<106){
s=(char)(t-48);
return 0;
}else{
s=(char)(t-58);
return 1;
}
}
//大数相加
void bignumadd(const char* num1,const char* num2,char* sum){
size_t len1=strlen(num1),len2=strlen(num2),i=0;//得到输入字符串长度
int f=0;//用于保存进位
if(len1>len2){//如果第一个字符串长
//len2比较小,先遍历完
for(i=0;i
{
f=addchar(num1[len1-i-1],num2[len2-i-1],f,sum);
}
//剩下部分
for(;i
{
f=addchar(num1[len1-i-1],'0',f,sum);//第一个字符串多出来的直接和0加
}
}else{//如果第二个字符串长
for(;i
f=addchar(num1[len1-i-1],num2[len2-i-1],f,sum);
}
for(;i
f=addchar('0',num2[len2-i-1],f,sum);//第二个字符串多出来的直接和0加
}
}
//别忘记最高位还可能会进位
for(;f>0;++i){
f=addchar('0','0',f,sum);
}
}
void showsum(const char* s){//显示计算结果
size_t len=strlen(s);
for(int i=len-1;i>-1;--i){//从最后一位开始逆序输出
putchar(s);
}
}
int main() {
const char* num1="8799999999999999999";
const char* num2="9999888888888888";
char s[100000]={0};//分配栈空间存放结果
bignumadd(num1,num2,s);
showsum(s);
getchar();
return 0;
}
广告

文章评论 2条评论)

登录后参与讨论

zhanglii2011_392530165 2019-3-19 14:53

https://gmplib.org/ 包含各种加减乘除

443955496_148404734 2019-3-15 15:20

学习,谢谢分享
相关推荐阅读
毛大闲 2019-11-04 21:09
【零基础】使用Tensorflow实现神经网络
一、序言  前面已经逐步从单神经元慢慢“爬”到了神经网络并把常见的优化都逐个解析了,再往前走就是一些实际应用问题,所以在开始实际应用之前还得把“框架”翻出来,因为后面要做的工作需要我们将精力集中在业务...
毛大闲 2019-10-29 23:16
【零基础】神经网络优化之Adam
一、序言  Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所...
毛大闲 2019-10-29 11:25
【零基础】神经网络优化之动量梯度下降
一、序言  动量梯度下降也是一种神经网络的优化方法,我们知道在梯度下降的过程中,虽然损失的整体趋势是越来越接近0,但过程往往是非常曲折的,如下图所示:    特别是在使用mini-...
毛大闲 2019-10-27 23:15
【零基础】神经网络优化之mini-batch
一、前言  回顾一下前面讲过的两种解决过拟合的方法:  1)L0、L1、L2:在向前传播、反向传播后面加个小尾巴  2)dropout:训练时随机“删除”一部分神经元  本篇要介绍的优化方法叫mini...
毛大闲 2019-10-24 15:45
【零基础】神经网络优化之dropout和梯度校验
一、序言  dropout和L1、L2一样是一种解决过拟合的方法,梯度检验则是一种检验“反向传播”计算是否准确的方法,这里合并简单讲述,并在文末提供完整示例代码,代码中还包含了之前L2的示例,全都是在...
毛大闲 2019-10-18 13:01
【零基础】神经网络优化之L1、L2
一、序言  前面的文章中,我们逐步从单神经元、浅层网络到深层网络,并且大概搞懂了“向前传播”和“反向传播”的原理,比较而言深层网络做“手写数字”识别已经游刃有余了,但神经网络还存在很多问题,比如最常见...
广告
我要评论
2
5
广告
关闭 热点推荐上一条 /2 下一条