广告

原创 C语言 超大数相加

2019-3-12 22:48 337 3 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[i]);
}
//剩下部分
for(;i
{
f=addchar(num1[len1-i-1],'0',f,sum[i]);//第一个字符串多出来的直接和0加
}
}else{//如果第二个字符串长
for(;i
f=addchar(num1[len1-i-1],num2[len2-i-1],f,sum[i]);
}
for(;i
f=addchar('0',num2[len2-i-1],f,sum[i]);//第二个字符串多出来的直接和0加
}
}
//别忘记最高位还可能会进位
for(;f>0;++i){
f=addchar('0','0',f,sum[i]);
}
}
void showsum(const char* s){//显示计算结果
size_t len=strlen(s);
for(int i=len-1;i>-1;--i){//从最后一位开始逆序输出
putchar(s[i]);
}
}
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

学习,谢谢分享
相关推荐阅读
CationLiu 2019-03-20 15:04
从电磁感应到无线充电
         电磁感应我们中学学过相关的内容,大概意思是“通电的导线周围会产生磁场”,“导线位于变化中的磁场时也能产生电流”,也就是电生磁、磁生电...
CationLiu 2019-03-14 14:11
二极管发光原理与LED灯带
二极管就是把一个N型半导体和P型半导体叠放一起,N型P型是向半导体中掺入了不同的杂质,由于N型、P型半导体的导电特性,在二极管的电路中电流只能由N极向P极单向导通。在电路里,二极管作为基础器件的原理就...
我要评论
2
3
广告
关闭 热点推荐上一条 /2 下一条