这几天专门学习了一下大数的有关计算方法,大数加减乘除模都会在后面讲到。

一、大数加法:

加法算是最简单的一类大数问题,先写上我的代码:

<span style="font-size:18px;"><strong></strong></span>
<span style="font-size:18px;"><strong>#include<stdio.h>
#include<algorithm>
using namespace std;
char num1[111], num2[111], num3[111];
int L, M;
int mark;
void add(char a[], char b[], char c[]){int len1 = strlen(a);int len2 = strlen(b);int i, j;int l = 0;L = 0;int temp;for(i = 0; i < len1/2; i++){temp = a[i];a[i] = a[len1-1-i];a[len1-1-i] = temp;}//把输入的两个大数都逆序排列,这个循环很常见,可以专门写一个函数。for(i = 0; i < len2/2; i++){temp = b[i];b[i] = b[len2-1-i];b[len2-1-i] = temp;}for(i = 0; i < len1 && i < len2; i++){M = (a[i] - '0' + b[i] - '0' + L) % 10;L = (a[i] - '0' + b[i] - '0' + L) / 10;c[i] = M + '0';}//M是代表这一位的数,L是代表这一位两数相加后的十位数,也就是进位数的大小if(i < len1){for( ; i < len1; i++){M = (a[i] - '0' + L) % 10;L = (a[i] - '0' + L) / 10;c[i] = M + '0';}}if(i < len2){for( ; i < len2; i++){M = (b[i] - '0' + L) % 10;L = (b[i] - '0' + L) / 10;c[i] = M + '0';}}while(L){c[i++] = L + '0';L /= 10;}//最后一位的进位不要忘记mark = i-1;
}//这个方法比较常见,最好要牢牢掌握/*while(len1 >= 0 && len2 >= 0){
M = (a[len1] - '0' + b[len2] - '0' + L) % 10;
L = (a[len1] - '0' + b[len2] - '0' + L) / 10;
c[l++] = M + '0';
len1--;
len2--;
}
while(len1 >= 0){
M = (a[len1] - '0' + L) % 10;
L = (a[len1] - '0' + L) / 10;
c[l++] = M + '0';len1--;
}
while(len2 >= 0){
M = (b[len2] - '0' + L) % 10;
L = (b[len2] - '0' + L) / 10;
c[l++] = M + '0';len2--;
}
while(L){
c[l++] = L + '0';
L /= 10;
}
for(i = 0; i < l/2; i++){
temp = c[i];
c[i] = c[l-1-i];
c[l-1-i] = temp;
}
for(i = 0; i < l; i++)
printf("%c",c[i]);*/
int main(){
int i, j;
int len1, len2;
scanf("%s%s",num1,num2);
len1 = strlen(num1);
len2 = strlen(num2);
add(num1,num2,num2);
for(i = mark; i >= 0; i--)
printf("%c",num2[i]);
printf("\n");
return 0;
}</strong></span>

1、用现在的方法而不用我之前的方法是因为现在这个方法灵活性更强,它可以把结果保存在相加的两个字符串的任意一个里,我之前的方法,是没有逆序排列的,所以说,这意味着只能先求出字符串长度len,再从len-1到0来逐位相加,这样我们就必须把相加的结果保存在第三个字符串里,浪费了内存。

2、用现在的方法,稍加修改,便可以实现连续多个大数相加。

多个大数连续相加代码如下:

#include<stdio.h>
#include<algorithm>
using namespace std;
char num1[111], num2[111], num3[111];
int L, M;
int mark;
void reverse(char a[]){//逆序倒置函数int len = strlen(a);int i;int temp;for(i = 0; i < len/2; i++){temp = a[i];a[i] = a[len-1-i];a[len-1-i] = temp;}
}
void add(char a[], char b[], char c[]){int len1 = strlen(a);int len2 = strlen(b);int i;int l = 0;L = 0;reverse(a);reverse(b);for(i = 0; i < len1 && i < len2; i++){M = (a[i] - '0' + b[i] - '0' + L) % 10;L = (a[i] - '0' + b[i] - '0' + L) / 10;c[i] = M + '0';}if(i < len1){for( ; i < len1; i++){M = (a[i] - '0' + L) % 10;L = (a[i] - '0' + L) / 10;c[i] = M + '0';}}if(i < len2){for( ; i < len2; i++){M = (b[i] - '0' + L) % 10;L = (b[i] - '0' + L) / 10;c[i] = M + '0';}}while(L){c[i++] = L + '0';L /= 10;}mark = i-1;
}
int main(){int i;int len1, len2;memset(num2,0,sizeof(num2));while(scanf("%s",num1) && strcmp(num1,"0")){len1 = strlen(num1);len2 = strlen(num2);add(num1,num2,num2);//看,这样我们就能仅仅用两个字符串就完成了多个大数相加的功能reverse(num2);}for(i = 0; i <= mark; i++)printf("%c",num2[i]);printf("\n");return 0;
}</strong></span>

加法就写到这里。

大数系列——大数加法相关推荐

  1. 易语言 大数计算 大数支持库的使用实例

    部分数据过大需要使用到大数计算,网上暂时没看到简单的例子实例,所以记录下.希望能帮上需要的人. 以下代码直接复制到易语言即可使用.支持库里需要勾选上    数值计算支持库 EC模块下载地址:易语言大数 ...

  2. C语言学习趣事_之_大数运算_加法

    C语言学习趣事_大数运算_之加法 1.引子    在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...

  3. c语言 大数开方,大数加法之C语言函数法(只有正数版)

    由于某些原因,我于今天2017-4-19将我的博文搬到博客园了,以后我就在这里扎根了. 之前想过在博客写文章方便日后复习,但一直未能实现,所以,现在这篇是我个人人生中第一篇博客,所以写博客完全没经验, ...

  4. 大数系列三——斐波那契数列——高效万进制,亿进制

    浅谈万进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既 ...

  5. 大数系列之大数相加(ACM通过)(一)

    大数相加 概述:本题主要解决HDU 1002的大数相加问题并且成功AC 主要思路 1:定义两个字符数组和两个int型数组,输入字符串数组 2:将两个字符数组的长度用'0'补到一样长 3:倒着存入int ...

  6. 阶乘和(n比较大---大数乘法+大数加法)

    1766: 阶乘和 时间限制: 1 Sec 内存限制: 128 MB 题目描述 用高精度计算出 sum=1!+2!+3!+-+n! (n≤50) 其中"!"表示阶乘, 例如:5!= ...

  7. 【大数篇】加法--减法篇

    对于非常大的数据我们需要用数组进行存储数据呀 加法---    由于数组下标是由0开始的,所以我们在考虑进位的时候应该向他下标增大的方向进位. but,在输入数据时我们的个位是最后输入,要让它到第一位 ...

  8. java 中 如何sum 乘法_JAVA中解决大数乘法和加法问题

    前言 在日常的算法练习中难免会遇见涉及阶乘的计算的题目,总所周知阶乘的数据会变得非常大,此时int和long型都装不下只能借助于String来表示,所以这里特为大家提供两种解决方案:1.使用Java ...

  9. c++ 大数类 大数模板

    分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法.减法.乘法.除法.n次方.取模.大小比较.赋值以及输入流.输出流的重载.. 并且使用这个大数模板,顺利AC了HDOJ上的1134这 ...

最新文章

  1. linux内存cached手动释放
  2. 使用Nginx的proxy_cache缓存功能取代Squid[原创]
  3. 服务器windows系统如何登陆,如何登陆windows云服务器
  4. 搞定面试算法系列 | 分治算法三步走
  5. 我的linux复习之一密码修改
  6. linux内存回收 内核参数
  7. Linux!为何他一人就写出这么强的系统,中国却做不出来?
  8. K个排序链表的合并(Hard)
  9. 环境配置就是安装软件,修改软件的配置文件,安装软件就是文件的复制,与新增--linux下一切皆文件...
  10. python 给数组修改值_DAY2-step4 Python数组:创建,追加,弹出,反转示例
  11. 清华大学计算机专业在职博士吧,清华大学在职博士含金量高吗?
  12. 计算机物理仿真,仿真物理实验室初中完整版
  13. Automated System Call Filtering for Commodity Software 翻译
  14. mysql atlas 文档_Atlas首页、文档和下载
  15. 说说 褥羊毛和薅羊毛的那些事
  16. SMTP命令 发送邮件 DOS命令
  17. MOT:Metrics MOTA
  18. 灵界的科学丨六、星际通信新科技──寻找外星人
  19. 手柄映射键盘_创新设计的多模手柄,北通宙斯T6精英机械游戏手柄体验点评
  20. 模拟法庭教学实训软件QY-RJ11

热门文章

  1. git创建分支及从分支下载代码
  2. php bc函数 500,PHP BC Math 函数详解
  3. 科学数据库Python——matplotlib画折线图
  4. 斐波那契数列(递归+源码+注释)
  5. 浅谈五种常用的特征选择方法
  6. Jenkins知识概括
  7. MySQL的三种注释方法
  8. 百年中国咖啡史,讲通了一个奶茶故事
  9. MATLAB 进度条
  10. 数据结构 KMP算法中next数组与nextval如何求