-
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语言
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语言高精度乘法
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语言实现)
2018-10-13 09:28:25高精度,是学C语言漫长的路上必须要学的一类程序 &gt;&gt;&gt;高精度加法(C语言实现)&lt;&...高精度减法(C语言实现)&...高精度乘法(高精乘低精)(C语高精度,是学C语言漫长的路上必须要学的一类程序
>>>高精度加法(C语言实现)<<<
>>>高精度减法(C语言实现)<<<
>>>高精度乘法(高精乘低精)(C语言实现)<<<
>>>高精度乘法(高精乘高精)(C语言实现)<<<
>>>高精度除法(高精除低精)(C语言实现)<<<
源代码&注释
#include <stdio.h> #include <string.h> char s[10000],ss[10000]; int a[10000],b[10000],c[10000]; int len,lenn; /*-------------高精度乘法(高)--------------*/ void cheng_gao() //高是指高精度乘高精度 { len = strlen(s); lenn = strlen(ss); memset(a,0,sizeof(a)); //清零数组 memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); for (int i = 0 ; i < len ; i++) a[len - i - 1] = s[i] - '0'; //将字符串转化为数组 for (int i = 0 ; i < lenn ; i++) b[lenn - i - 1] = ss[i] - '0'; memset(c,0,sizeof(c)); //清零 for (int i = 0 ; i < len ; i++) for (int j = 0 ; j < lenn ; j++) c[i + j] += a[i] * b[j]; //运算(这个就有一点复杂了) int l = len + lenn - 1; //l是结果的最高位数 for (int i = 0 ; i < l ;i++) { c[i + 1] += c[i] / 10; //保证每一位的数都只有一位,并进位 c[i] %= 10; } if (c[l] > 0) l++; //保证最高位数是对的 while (c[l - 1] >= 10) { c[l] = c[l - 1] / 10; c[l - 1] %= 10; l++; } while (c[l - 1] == 0 && l > 1) l--; //while去零法 printf("结果:\n"); printf("%s × %s = ",s,ss); for (int i = l - 1; i >= 0 ; i--) //输出结果 printf("%d",c[i]); printf("\n"); //换行 } //高精度乘法(高)你懂了吗 void print() //输出函数 { printf("高精度乘法(高)(By STY)\n\n"); printf("退出请按“Ctrl+Z”(在键盘上),并按回车,谢谢使用!\n"); printf("请输入两个数字:\n"); printf("数字:(用空格隔开)\n"); } int main() { print(); while (scanf("%s%s",s,ss) != EOF) { printf("\n结果:\n"); cheng_gao(); //引用高精度乘法函数 printf("\n\n"); print(); } return 0; }
这就是高精度乘法(高精乘高精)的整段代码,
希望大家在看了这篇文章后理解和会使用高精度乘法(高精乘高精)的运算了
希望大家喜欢这篇文章!!!
如有问题请留言,谢谢!!!>>>我的博客<<<
-
C语言中的高精度乘法
2015-11-06 00:22:50大一新生初谈C语言中的高精度乘法 1为什么需要高精度乘法及其实质 2高精度乘法原理 3高精度乘法的实现 a 运算前的准备 b一位位地运算 c处理进位 d输出结果 4整体的代码 5结语 大一新生对高精度乘法的一种通俗理解。... -
C语言实现 蓝桥杯 算法提高 高精度乘法
2020-07-06 18:55:26试题 算法提高 高精度乘法 &... -
高精度乘法
2011-10-23 16:38:02此程序是一个计算高精度的c++程序,使用字符方法,利用数组存储。 -
C语言实现高精度乘法
2021-08-13 14:08:19大一小白尝试C语言高精度乘法 一、高精度乘法是什么 高精度乘法就是对于普通数据类型无法表示的大整数进行乘法运算。 二、为什么需要高精度乘法 在C语言中,常用的数据类型有int, long long, double等,但是这些数据... -
高精度乘法(高精乘低精)(C语言实现)
2018-09-09 15:43:32>>>高精度乘法(高精乘低精)(C语言实现) >>>高精度乘法(高精乘高精)(C语言实现) >>>高精度除法(高精除低精)(C语言实现) #源代码&注释 #include #include using namespace std; char s[10000... -
高精度乘法(高精度乘高精度)
2021-09-27 15:54:10说实话我刚开始学高精度的时候觉得挺难的 ,写了代码之后才感觉其实高精度乘法还是比较简单的,就是代码量稍稍有点大。 接下来进入正题 先上张图 没错应该看的出来,高精度乘法其实就是一位一位去乘,然后按位... -
C语言高精度乘法运算
2021-05-16 14:55:27int c[3000]; //两个数相乘,结果保存在数组c中 void chengfa(char numberN[150000],char numberM[150000]){ int n = strlen(numberN), m = strlen(numberM); int a[n], b[m]; int i, j; for (i = 0, j = n - 1;... -
C++ 的高精度乘法
2020-02-21 15:52:31为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据,C++ 没有对应的数据类型进行表示。...高精度乘法计算原理 在读小学时,我们做乘法都采用竖式方法,如图 1 ... -
高精度乘法c语言(dev-c++)帮忙看下哪错了
2021-05-19 17:51:03满意答案小早川秋秋秋2013.07.22采纳率:57%等级:7已帮助:610人帮你修改了一下。#include#include#include...int a[30]={0},b[30]={0},c[30]={0},g=0,d=0,e=0,f=0,k=0,i,j;//dgets(a1);d=strlen(a1);gets(b1);e=s... -
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的... -
1136高精度乘法.cpp
2019-09-29 21:05:36高精度,是学C语言漫长的路上必须要学的一类程序,菜鸡博主大一刷OJ时候的存货 -
高精度高精度乘法(C++)
2021-08-04 22:29:31今天咱们的主角是高精度高精度乘法 咱们先回顾一下竖式乘法 我们先不急着进位,先来看看,对应位置上的数字都是这么来的。 对于不足位我们补充零后,不难发现,对应位置的最后答案,是由该位置起以后的全部... -
793 高精度乘法(高精度乘法模板)
2021-11-20 15:31:08对于python语言来说其实可以不用高精度乘法,直接使用两个数字相乘也不会溢出,而且直接计算的速度更快,而对于其他语言来说则需要使用高精度乘法才不会出现溢出的情况。 3. 代码如下: c++代码(c++与python的运行... -
C语言羁绊之高精度乘法计算
2021-05-23 07:58:31这里的高精度乘法主要指按位模拟运算,实际上就是模拟乘法的过程,也就是笔算的过程。(你拿张纸就可以轻易的模拟出来,但是你原来可能没发现过其中的规律)。2,原理既然是一个很大的数,我们便不能够在用简单的数据... -
(C语言)高精度乘法
2017-04-22 21:22:43首先应判断两个数有没有为零,然后判断两个数之前有没有负号,如果有负号,则不考虑负号将字符串倒置转换成数字类型放入一个数组中,然后将两个数组的每一位对应相乘,进位与之前的高精度加法一样,最后输出的时候的... -
AcWing 793. 高精度乘法(高精度乘低精度,高精度乘高精度)
2021-06-14 16:10:17高精度乘法 题意 给定两个正整数,计算它们的积。正整数长度的范围是1到100000。 分析 1.高精度乘法分为高精度乘以低精度和高精度乘以高精度。 算法1:高精度乘以低精度 1.从高精度数的低位开始,每一个数位上的数... -
c++高精度乘法代码
2022-04-22 22:32:49本文提供高精度乘法代码 可能不太完美,也可能不是最优解 代码手打 高精度乘法 #include<bits/stdc++.h> using namespace std; string s1,s2; int a[100005],b[10005],c[200005]; int lena,lenb,lenc; ... -
高精度乘法(C++实现)
2020-10-22 12:42:442.高精度乘法将大数以字符串形式输入,然后拆分转换为一位一位的整数,之后按照小学的竖式运算方法完成编码。(注意:字符串中0下标从左开始,竖式运算中0下标从右开始,故代码中需要有一个逆序操作。如a[i]=s1[s1.... -
C++高精度乘法模板
2018-07-09 11:15:08方法还是与高精度加法的方法差不多,列一个竖式,就可以发现其中的规律了。 #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;gt; #include &amp;lt;...