大数运算(4)——大数乘法
首先说一下乘法计算的算法:同样是模拟人工计算时的方法。
从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再将各项结果相加,得出最后结果。
计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。
我们以125*53为例来说明计算过程:
1、先算125*3,3*5得到15个1,3*2得到6个10,3*1得到3个100;
2、接下来算125*5,5*5得到25个10,2*5得到10个100,5*1得到5个1000;
3、乘法过程完毕。接下来从 a[0]开始向高位逐位处理进位问题。a[0]留下5,把1 加到a[1]上,a[1]变为32 后,应留下2,把3 加到a[2]上……最终使得a里的每个元素都是1 位数,结果就算出来了
结果就是6625。
总结一个规律:即一个数的第i 位和另一个数的第j 位相乘所得的数,一定是要累加到结果的第i+j 位上。这里i, j 都是从右往左,从0 开始数。
即:ans[i+j] = a[i]*b[j];
另外进位时要处理,当前的值加上进位的值再看本位数字是否又有进位;前导清零。
下面是C语言代码实现:
#include<stdio.h>
#include<string.h>
#define MAX 100
char a[MAX],b[MAX];//用字符串进行数字的输入
int x[MAX+10],y[MAX+10],z[MAX*2+10];//积的位数最多是因数位数的两倍
int main()
{ int len1,len2,i,j;while(~scanf("%s %s",a,b)){len1=strlen(a);len2=strlen(b);for(j=0,i=len1-1;i>=0;i--)//将字符串中字符转化为数字,并倒序储存 x[j++]=a[i]-'0';for(j=0,i=len2-1;i>=0;i--)y[j++]=b[i]-'0';for(i=0;i<len1;i++)//将因数各个位上的数字与另一个各个位上的数字相乘 {for(j=0;j<len2;j++)z[i+j]=z[i+j]+x[i]*y[j];//先乘起来,后面统一进行进位 }for(i=0;i<MAX*2;i++)//进行进位 {if(z[i]>=10) //若>=10 {z[i+1]=z[i+1]+z[i]/10; //将十位上数字进位 z[i]=z[i]%10; //将个位上的数字留下}}for(i=MAX*2;i>0;i--) //删除0的前缀 {if(z[i]==0)continue;elsebreak;}for(;i>=0;i--) //倒序输出 printf("%d",z[i]);printf("\n");}return 0;
}
大数运算(4)——大数乘法相关推荐
- 大数运算(8)——大数幂运算
大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...
- 大数运算(7)——大数阶乘(求阶乘)
对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大. 就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值.这时候,我们要通 ...
- 大数运算(5)——大数除法(取模、取余)
有关于大数除法的运算可以大致分为两种:一种是求商(取模),另一种是求余数(取余). 有两个大整数a和b,当a==b时,a/b==1,余数是0.(a!=0,b!=0) 当a>b时,a/b>= ...
- 大数运算(3)——大数减法
大数的减法与大数加法的方法有相似之处的,都是模拟人工运算的,从最低位开始运算,一直到最高位. 其方法是: 首先,要判断减数和被减数哪一个位数长,减数位数长是正常减:被减数位数长,则被减数减减数,最后还 ...
- 大数运算(2)——大数加法
/*大数加法的中心思想就是:模拟人工列竖式算加法的方法.先从最低位开始相加,判断是否进1,一直到最高位. 例如: 求12545642233+278545的和,该怎么算? 是这样的: 3 3 ...
- 大数运算(1)——大数储存
int (16位) -32768-32767 (注:现在大多数的编译器的int型是32位的 也就是说跟long型的大小一样) long long或__int64(64位) -922337203 ...
- 大数运算(6)——大数阶乘(求位数)
对于求一个大数的阶乘的位数一般有两种方法: 第一种: lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1 =[lgN+lg(N-1)+lg(N-2)+......+lg ...
- c语言编程 大数运算,求大数运算C语言代码?
#define MAX 400 void my_read(int *a) { int len,i,flag=0; char s[MAX]; aa: while(1) { scanf("%s& ...
- Java实现大数运算
一.大数运算介绍 大数运算,顾名思义,就是很大的数值的数进行一系列的运算.它是指由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数 ...
最新文章
- 华为云IoT提出泛在新联接,让万物皆可联
- AI换脸引发全民恐慌,用对方向却能推动行业变革
- 27 个问题,告诉你Python为什么这么设计
- lt form gt 在html,HTML lt;formgt; 标签的 accept
- Erlang并发机制 –进程调度
- c语言switch同时比较多个变量,C语言学习if和switch分支选择结构
- Asp.Net Mvc表单提交之List集合
- 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍怎么样
- javascript中this值的引用
- svg矢量图path路径标签坐标点英文字母含义
- jquery 输入框,单选按钮,下拉列表和复选框的使用
- PHP压缩CSS文件
- ionic3-ng4学习见闻--(多环境方案)
- bilibili助手C2C服务器,Bilibili助手
- 正态分布假设检验相关知识
- 纳米金13nm|金属纳米粒子/Nano gold制备方法-齐岳生物
- 用html实现彩虹动画
- 李宏毅《机器学习》误差
- 软件需求工程 高校教学平台 软件需求规格说明书 part 1 (重点!!!)
- Kubernetes Pod日志太大导致磁盘空间的问题