-
2021-05-19 17:52:28
对于要求很搞的C语言高精度乘法,相信很多人还没有用到过,应为在常规的应用中一般精度的乘法就可以满足我们的计算要求,今天一起来看看高精度乘法的实现方法吧。
/*
高精度乘法
输入:两行,每行表示一个非负整数(不超过10000位)
输出:两数的乘积。
*/
#include
#include
#include
#include
#define MAX 10001
int bigchenfa(int *sum,int *a,int *b,int lsum,int la,int lb)
{
int i,j,k ;
memset(sum,0,sizeof(sum));
lsum = 0 ;
for(i=1 ; i<= la ; i ) /*用数组模拟运算*/
for(j=1,lsum=i-1; j<= lb ; j )
sum[ lsum] = b[j] * a[i] ;
for(i=1 ; i<= lsum ; i )/*进位处理*/
if (sum[i] >= 10)
{
if ( sum[lsum] >= 10)
lsum ;
sum[i 1] = sum[i] / 10 ;
sum[i] %= 10 ;
}
return lsum ;
}
int main(void)
{
int a[MAX]={0},b[MAX]={0},sum[MAX*2]={0} ;
int la=0,lb=0,lsum=0;
int i,j ;
char sa[MAX],sb[MAX] ;
scanf(\"%s %s\",sa,sb);
la = strlen(sa);
lb = strlen(sb);
for(i=1,j=la-1; i<= la ; i ,j--)
a[i] = sa[j] - ’0’ ;
for(i=1,j=lb-1; i<= lb ; i ,j--)
b[i] = sb[j] - ’0’ ;
lsum = bigchenfa(sum,a,b,lsum,la,lb) ;
for(i=lsum ; i>= 1 ; i--) [Page]
printf(\"%d\",sum[i]);
printf(\" \");
system(\"pause\");
return 0 ;
}
本文来源:搜集于网络
更多相关内容 -
C语言高精度乘法
2013-07-21 20:02:46如何用C语言写高精度乘法,高精度乘法需要用到函数调用,指针等知识 -
c语言高精度乘法
2020-12-03 21:18:36高精度乘法 众所周知,由于整型数不能满足过大数的运算,所以,在进行过大数的乘法运算时需要运用一种新的方法------高精度乘法。 下面我将介绍大数相乘的几个步骤。 1.输入两个乘数,并定义后面需要到的变量 #...高精度乘法
众所周知,由于整型数不能满足过大数的运算,所以,在进行过大数的乘法运算时需要运用一种新的方法------高精度乘法。
下面我将介绍大数相乘的几个步骤。1.输入两个乘数,并定义后面需要到的变量
#include <stdio.h> #include <string.h> int main(void) { char a[100],b[100]; scanf("%s %s",&a,&b); int af[100],bf[100]; int x=strlen(a); int y=strlen(b)
2.将字符数组中的数转移到整型数组中
for(int i=0;i<x;i++) { af[i]=a[x-i-1]-'0'; bf[i]=b[x-i-1]-'0'; }
3.我们再声明一个数组c来储存答案。大家通过一个简单的乘法运算进行模拟就可以看出,以同样的储存规则,a[0] * b[0] = c[0]; a[0] * b[1] + a[1] * b[0] = c[1];逐渐我们可以发现规律: "c[i + j] += a[i] * b[j]"同过一个循环去实现,就可以把c[i + j]计算出来。
for(int i=0;i<x;i++) { for(int j=0;j<y;j++) { c[i+j]=c[i+j]+af[i]*bf[j]; } }
4.把c中的每一个都进位,最后输出。
int num=0; int t; while(c[t]!=0) { t++; } for(int i=0;i<t;i++) { num=c[i]+num; if(num>=10) { c[i]=num%10; num=num/10; } else { c[i]=num; num=0; } } if(num!=0) { c[t]=num; for(int i=t;i>=0;i--) { printf("%d",c[i]); } } else { for(int i=t-1;i>=0;i--) { printf("%d",c[i]); } } return 0; }
-
高精度乘法 C语言
2021-01-04 16:05:28高精度乘法 为什么需要高精度乘法 原因: 首先我们看一看C语言用到的表示整数的数据类型 1.int 2.long int 3.long long int 即使是最大的long long int 类型能表达的位数依然有限 所以需要该表处理更大数据的策略 ...高精度乘法
为什么需要高精度乘法
原因:
首先我们看一看C语言用到的表示整数的数据类型
1.int
2.long int
3.long long int
即使是最大的long long int 类型能表达的位数依然有限(可以去百度具体就不写了)
所以需要一个处理更大数据的策略如何改进处理大数据的乘法
既然我们的计算机无法处理这么大的数字,那么我们可以试着转换一下思想,做一个模拟乘法,他不一定是计算机在完成乘法而是给出一个算法,计算机程序执行完以后结果就是乘法得出的结果。而同时计算机不用处理这么大的数据。最容易想到的是把数字当作字符处理。下main给出了两种方法
两种思路
a.
示意图:
代码:#include <stdio.h> #include <string.h> int main() { int a[1000],b[1000],c[1000];//准备好三个数组 int lena,lenb,lenc,i,j; char s1[]="986"; char s2[]="123"; lena=strlen(s1); lenb=strlen(s2); for(i=0;i<1000;i++)//将c数组赋予初值,后面会用上 c[i]=0; for(i=1;i<=lena;i++)//986存入a[] a[i]=s1[lena-i]-'0'; for(i=1;i<=lenb;i++)//123存入b[] b[i]=s2[lenb-i]-'0'; for(i=1;i<=lenb;i++)//遍历被乘数123 for(j=1;j<=lena;j++)//遍历乘数986 c[i+j-1]+=a[j]*b[i];//c数组的 lenc=lena+lenb-1; for(i=1;i<=lenc;i++) { c[i+1]+=c[i]/10;//求进位并把进位加入高位 c[i]%=10;//保存余数 } lenc++;//将数组长度加1用来保留前面产生的进位 while(c[lenc]==0&&lenc>1) lenc--;//删去前面多余的0 for(i=lenc;i>=1;i--)//遍历输出 printf("%d",c[i]); printf("\n"); return 0; }
流程:
b.
示意图;
代码:
(与上一个代码基本一样除了标注部分)#include <stdio.h> #include <string.h> int main() { int a[1000],b[1000],c[1000]; int lena,lenb,lenc,i,j; char s1[]="986"; char s2[]="123"; lena=strlen(s1); lenb=strlen(s2); for(i=0;i<1000;i++) c[i]=0; for(i=1;i<=lena;i++) a[i]=s1[lena-i]-'0'; for(i=1;i<=lenb;i++) b[i]=s2[lenb-i]-'0'; //************************************************ (和上一个代码不一样部分) for(i=1;i<=lenb;i++) for(j=1;j<=lena;j++) { c[i+j-1]+=a[j]*b[i]; c[i+j]+=c[i+j-1]/10; c[i+j-1]%=10; } lenc=lena+lenb; //************************************************ for(i=1;i<=lenc;i++) { c[i+1]+=c[i]/10; c[i]%=10; } lenc++; while(c[lenc]==0&&lenc>1) lenc--; for(i=lenc;i>=1;i--) printf("%d",c[i]); printf("\n"); return 0; }
流程图:
-
C语言中的高精度乘法
2021-05-19 17:10:12大一新生初谈C语言中的高精度乘法大一新生初谈C语言中的高精度乘法1为什么需要高精度乘法及其实质2高精度乘法原理3高精度乘法的实现a 运算前的准备b一位位地运算c处理进位d输出结果4整体的代码5结语1、为什么需要高...大一新生初谈C语言中的高精度乘法
大一新生初谈C语言中的高精度乘法
1为什么需要高精度乘法及其实质
2高精度乘法原理
3高精度乘法的实现
a 运算前的准备
b一位位地运算
c处理进位
d输出结果
4整体的代码
5结语
1、为什么需要高精度乘法及其实质
我们知道,计算机内部直接用int或double等数据类型储存数字是有范围限制的,即当数据运算大小过大后,计算机将会出现溢出情况,使得计算结果不够精确。为了能够使计算机精确地计算高位的数字,我们需要学会使用高精度乘法。
事实上,高精度乘法就是通过编程的方法,把我们小学时候简单的数学乘法运算的步骤在计算机上完美的演示一遍而已
2、高精度乘法原理
既然是一个很大的整数,我们便不能够再用简单的数据类型直接储存这些整数。我们可以自然得想到要通过数组或字符串来储存数字。字符串的特点方便我们对于高位整数的输入,而整形数组的简便性更有利于每个位数的计算,因而我们结合两者的优点,不难得出高精度乘法的大致流程:
a、通过两个字符串输入两个整数;
b、引人两个数组,将两个整数通过一定的运算,分别将每一位的数字储存进数组中;
c、进行每一位的运算;
d、处理进位;
e、输出结果;
下面我们通过代码来一步步实现它
3、高精度乘法的实现
(a) 运算前的准备
#include
#include
int main() {
char number1[1500], number2[1500];
scanf("%s%s", number1, number2);
int n = strlen(number1), m = strlen(number2);
int a[n], b[m];
上面的代码使我们输入了两个乘数,并且通过strlen函数确定了乘数的位数,并且将整形数组的长度同时定位好了。
我们接着来写:
int i, j;
for (i = 0, j = n - 1; i < n; i++, j--) {
a[i] = numberN[j] - '0';
}
for (i = 0, j = m - 1; i < m; i++, j--) {
b[i] = numberM[j] - '0';
}
通过ASCII码的运算,我们已经成功地将两个乘数的各位数拆开来储存进两个数组中了,并且a[0]为个位,a[1]为十位,以此类推。此时高精度乘法运算前的准备已经做好。
(b)一位位地运算
我们再声明一个数组c来储存答案。大家通过一个简单的乘法运算进行模拟就可以看出,以同样的储存规则,a[0] * b[0] = c[0]; a[0] * b[1] + a[1] * b[0] = c[1];逐渐我们可以发现规律: "c[i + j] += a[i] * b[j]"同过一个循环去实现,就可以把c[i + j]计算出来,需要指出的是,这里的计算我们还没有进行进位处理。
1 2 3
* 5 6 7
*--------------------------
7 14 21
6 12 18
5 10 15
*--------------------------
5 16 34 32 21
下面上代码:
int c[3000];
for (i = 0; i < 3000; i++) {
c[i] = 0;
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
c[i + j] += a[i] * b[j];
}
}
注意一下:这里数组c的长度并不一定是3000,操作者可以根据实际情况来调整结果最大位数的大小,虽然我觉得3000是够用了。。。
(c)处理进位
for (i = 0; i < n + m; i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
这个进位的处理代码并不难,有一定c语言初级基础的人都可以看懂(笔者写这篇博客时候还只是一个上大一2个月的新生呢。。。)
(d)输出结果
好了,现在我们要输出结果了。我们知道,现在c数组里储存着结果的各位数字,我们只需要按照正确的顺序把数字一个个print出来就可以了!
for (j = 2999; j > 0; j--) {
if (c[j] != 0)
break;
}
for (i = j; i >= 0; i--) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}
在这里我需要指出的是,因为c数组的长度是固定的,但我们并不知道最终的结果有多少位,而我们又可以看出结果应该从后往前print。所以在输出前需要用一个for循环确定一下结果的位数。(笔者能力有限,暂时还没有想出更好的方法。。。)
确定了位数之后,就从后往前输出就可以得到正确的答案了!!!
(有点小激动。。。)
4、整体的代码
为了方便读者的阅读,我把第3部分的肢解代码集中起来:
#include
#include
int main() {
char numberN[1500], numberM[1500];
scanf("%s%s", numberN, numberM);
int n = strlen(numberN), m = strlen(numberM);
int a[n], b[m];
int i, j;
for (i = 0, j = n - 1; i < n; i++, j--) {
a[i] = numberN[j] - '0';
}
for (i = 0, j = m - 1; i < m; i++, j--) {
b[i] = numberM[j] - '0';
}
int c[3000];
for (i = 0; i < 3000; i++) {
c[i] = 0;
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
c[i + j] += a[i] * b[j];
}
}
for (i = 0; i < n + m; i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
for (j = 2999; j > 0; j--) {
if (c[j] != 0)
break;
}
for (i = j; i >= 0; i--) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}
5、结语
笔者是中山大学软件工程专业的一位大一新生,最近刚接触到高精度乘法,觉得有点神奇,于是写下这篇博客(这是我的第一篇与技术有关的博客。。。),再梳理一遍后思路的确更加清晰了。由于还没有深入精通C语言,所以这个高精度乘法的代码还不够简洁,高手勿喷。如果大家有更好的建议欢迎提出交流,我会虚心学习的。同时,希望这篇博客能够帮助到更多的接触高精度乘法的C语言初学者们,我个人觉得写得还是挺通俗易懂的。。。
如果有个别字打错的,请多包涵。。。
好了,最后谢谢大家的认真阅读!!!!!!
-
高精度乘法(高精乘高精)(C语言实现)
2018-10-13 09:28:25高精度,是学C语言漫长的路上必须要学的一类程序 &gt;&gt;&gt;高精度加法(C语言实现)&lt;&...高精度减法(C语言实现)&...高精度乘法(高精乘低精)(C语 -
C语言实现 蓝桥杯 算法提高 高精度乘法
2020-07-06 18:55:26试题 算法提高 高精度乘法 &... -
C语言羁绊之高精度乘法计算
2021-05-23 07:58:31很大一部分借鉴了(C语言的高精度算法)这一博客,你们可以去看看。欢迎指正!!!1,定义对于计算机无法用普通数据类型(如:longint)表示的大整数进行乘法运算,称为高精度算法。这里的高精度乘法主要指按位模拟运算... -
C语言高精度乘法运算
2021-05-16 14:55:27#include<stdio.h> #include<string.h> int c[3000]; //两个数相乘,结果保存在数组c中 void chengfa(char numberN[150000],char numberM[150000]){ int n = strlen(numberN), m = strlen(numberM);... -
C语言实现高精度乘法
2021-08-13 14:08:19大一小白尝试C语言高精度乘法 一、高精度乘法是什么 高精度乘法就是对于普通数据类型无法表示的大整数进行乘法运算。 二、为什么需要高精度乘法 在C语言中,常用的数据类型有int, long long, double等,但是这些数据... -
(C语言)高精度乘法
2017-04-22 21:22:43首先应判断两个数有没有为零,然后判断两个数之前有没有负号,如果有负号,则不考虑负号将字符串倒置转换成数字类型放入一个数组中,然后将两个数组的每一位对应相乘,进位与之前的高精度加法一样,最后输出的时候的... -
高精度乘法(高精乘低精)(C语言实现)
2018-09-09 15:43:32>>>高精度乘法(高精乘低精)(C语言实现) >>>高精度乘法(高精乘高精)(C语言实现) >>>高精度除法(高精除低精)(C语言实现) #源代码&注释 #include #include using namespace std; char s[10000... -
高精度阶乘(c语言)
2020-12-26 12:27:17在刷题时偶然遇到了高精度阶乘的问题,于是立即自学了一下,在此作简要总结。 **提出背景:*普通的阶乘算法(不断用i(i+1)循环)对于较大数的阶乘,由于运算结果位数过大,会造成溢出,使结果精度低。此时引出高... -
【基础】(C语言)高精度算法
2020-12-14 17:56:08一、高精度算法基础二、高精度乘法1.计算流程2.完整代码三、总结 前言:为什么我们需要高精度算法? 多数时候我们需要进行非常庞大的数字运算,其中涉及四则运算,加减乘除,但是当连最大的long long类型也容纳不下... -
C语言实现高精度加法
2021-05-21 13:47:04免费资源网 - https://freexyz.cn/本篇为高精度加法的计算,接下来我还会去写高精度乘法的计算。一、高精度运算的概念高精度运算其实就是参与运算的数完全超出基本数据类型所能表示的范围的运算(例如int型范围就是 -... -
C语言程序设计之高精度乘法
2019-11-22 18:49:08有了前面的基础,这个乘法就是小意思 #include<stdio.h> #include<string.h> int main() { char ch[1],s1[100],s2[100]; int a[100]={0},b[100]={0},c[100]={0}; int t1,t2,t,i,j,d; gets(s1); ... -
高精度乘法 C语言.doc
2021-05-19 17:52:02#include #include char* Add(char* str1,char *str2){int a[1000],b[1000],c[1001],carry[1001]; c[0]=0;int i,Maxlen; int len1,len2; char str3[1001],*str;len1=strlen(str1);len2=strlen(str2);... -
C语言中的高精度乘法代码实现
2021-11-20 18:55:44笔者是宜春学院大一学生,为迎接即将到来的选拔赛,学一下高精度,顺便写个博客巩固一下水平有限 若有不足 请多指教哈 我们模拟的是小学学的乘法运算 将该过程转化具体的代码去实现。 看一下原理吧 电脑上画图... -
高精度加法(C语言实现)
2018-08-09 17:58:46高精度,是学C语言漫长的路上必须要学的一类程序 那么,先来讲一下高精度加法吧! 源代码&amp;amp;amp;amp;amp;amp;amp;amp;注释 //小程序版 #include&amp;amp;amp;amp;amp;amp;... -
P1919 FFT加速高精度乘法
2021-05-20 11:13:42P1919 FFT加速高精度乘法题意:给出两个n位10进制整数x和y,你需要计算x*y。题解:对于十进制数我们可以将其转换成\(a0*10^0+a1*10^1+a2*10^2...an*10^n\)那么对于两个数,我们就可以求出两个的系数表示后得到a的... -
[蓝桥杯][算法提高VIP]高精度乘法 (C++代码)(压位 17ms)
2021-05-22 02:53:42想起来我以前写的朴素乘法,惨不忍睹。当然还有比这更快的 快速傅里叶变换 (不会)。这里跟具体跟朴素算法也差不多,如果用 1w 进制,就是把每 4 位当作一个数存在一起,逆序放在一个数组里。这里用到 sscanf 把字符... -
1136高精度乘法.cpp
2019-09-29 21:05:36高精度,是学C语言漫长的路上必须要学的一类程序,菜鸡博主大一刷OJ时候的存货 -
c语言高精度系列(慢慢更新中)
2021-12-05 21:25:10但是如果我们要计算到更大数值时,就会出现问题,所以我们才需要高精度系列来帮助我们计算机来计算. 高精度加法 #include <stdio.h>//实现高精度加法 #include <string.h> int main() { char x[100]; ... -
高精度计算n阶乘的c语言源代码和解释
2021-05-21 11:25:24《高精度计算n阶乘的c语言源代码和解释》由会员分享,可在线阅读,更多相关《高精度计算n阶乘的c语言源代码和解释(9页珍藏版)》请在金锄头文库上搜索。1、1高精度计算大数阶乘的 c 语言源代码和解释 关键词:高精度,... -
C++高精度整型对象实现
2021-10-14 09:08:27高精度的算法,一般的方式是用一个很长的数组去记录数据,数组的每一位记录固定位数的数字,记录顺序是低位到高位。计算方式则通常采用模拟立竖式计算。计算方式有一些优化方法,比如FFT快速傅里叶变换优化乘法,...