-
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 ;
}
本文来源:搜集于网络
更多相关内容 -
1307:【例1.3】高精度乘法
2018-07-26 12:02:061307:【例1.3】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4358 通过数: 1440 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正... -
c++高精度乘法(五万位*五万位)
2019-11-10 12:56:09c++高精度乘法,字符串做法,支持50000位两数相乘,希望大佬帮助改进。Thanks♪(・ω・)ノ -
信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法
2022-02-07 16:25:52ybt 1307:【例1.3】高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 【题目考点】 1. 高精度 考察:高精乘高精 高精度计算讲解 【解题思路】 ybt 1307:【例1.3】高精度乘法:该题中是两个100位...【题目链接】
ybt 1307:【例1.3】高精度乘法
ybt 1174:大整数乘法
OpenJudge NOI 1.13 09:大整数乘法【题目考点】
1. 高精度
考察:高精乘高精
高精度计算讲解【解题思路】
ybt 1307:【例1.3】高精度乘法:该题中是两个100位的数字相乘,结果可能达到200位。
ybt 1174 / OpenJudge 1.13 09 大整数乘法:该题中是两个200位的数字相乘,结果可能达到400位。
代码中将数字数组长度N设为500,即可满足以上两题。【题解代码】
解法1:使用数组与函数
#include <bits/stdc++.h> using namespace std; #define N 505 void Multiply(int a[], int b[], int r[])//高精乘高精 { int i; for(i = 1; i <= a[0]; ++i) { int c = 0; for(int j = 1; j <= b[0]; ++j) { r[i+j-1] += a[i]*b[j] + c; c = r[i+j-1] / 10; r[i+j-1] %= 10; } r[i+b[0]] += c; } i = a[0] + b[0];//确定数字位数 while(r[i] == 0 && i > 1) i--; r[0] = i; } void toNum(char s[], int a[]) { a[0] = strlen(s); for(int i = 1; i <= a[0]; ++i) a[i] = s[a[0] - i] - '0'; } void showNum(int a[]) { for(int i = a[0]; i >= 1; --i) cout << a[i]; } int main() { int a[N] = {}, b[N] = {}, r[N] = {}; char s[N]; cin >> s; toNum(s, a); cin >> s; toNum(s, b); Multiply(a, b, r); showNum(r); return 0; }
解法2:使用高精度数字类
#include<bits/stdc++.h> using namespace std; #define N 505 class HPN { private: int a[N]; public: HPN() { memset(a, 0, sizeof(a)); } HPN(char s[]) { memset(a, 0, sizeof(a)); a[0] = strlen(s); for(int i = 1; i <= a[0]; ++i) a[i] = s[a[0] - i] - '0'; } int& operator [] (int i) { return a[i]; } void setLen(int i)//确定数字位数 { while(a[i] == 0 && i > 1) i--; a[0] = i; } HPN operator * (HPN &b) { HPN r; for(int i = 1; i <= a[0]; ++i) { int c = 0; for(int j = 1; j <= b[0]; ++j) { r[i+j-1] += a[i]*b[j] + c; c = r[i+j-1] / 10; r[i+j-1] %= 10; } r[i+b[0]] += c; } r.setLen(a[0] + b[0]); return r; } void show() { for(int i = a[0]; i >= 1; --i) cout << a[i]; } }; int main() { char s1[N], s2[N]; cin >> s1 >> s2; HPN a(s1), b(s2), r; r = a*b; r.show(); return 0; }
-
信息学奥赛一本通(1307:【例1.3】高精度乘法)
2021-06-04 12:56:011307:【例1.3】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 30399 通过数: 10666 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高...1307:【例1.3】高精度乘法
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 30399 通过数: 10666【题目描述】
输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。
【输入】
输入两个高精度正整数M和N。
【输出】
求这两个高精度数的积。
【输入样例】
36 3
【输出样例】
108
【参考代码】
#include <stdio.h> #include <string.h> #define MAXN 10010 char s1[MAXN],s2[MAXN]; int a[MAXN],b[MAXN],c[MAXN]; int main() { int i,j,flaga=1,flagb=1; int lena,lenb,lenc,jw; //读入字符串 scanf("%s %s",s1,s2); //符号处理,1表示正数,0表示负数 if(s1[0]=='-') { flaga=0; strcpy(&s1[0],&s1[1]); } if(s2[0]=='-') { flagb=0; strcpy(&s2[0],&s2[1]); } //送入整数数组 lena=strlen(s1); for(i=0;i<lena;i++) { a[i]=s1[lena-i-1]-'0'; } lenb=strlen(s2); for(i=0;i<lenb;i++) { b[i]=s2[lenb-i-1]-'0'; } //模拟竖式乘法 for(i=0;i<lena;i++) { jw=0; //上一轮计算进位 for(j=0;j<lenb;j++) { //交叉乘积 c[i+j]=a[i]*b[j]+jw+c[i+j]; //当前乘积+上次乘积进位+原数 jw=c[i+j]/10; //处理进位 c[i+j] %=10; } c[i+lenb]=jw; //进位设置 } //删除前导零 lenc=lena+lenb; for(i=lenc-1;i>=0;i--) { if(c[i]==0 && lenc>1) lenc--; else break; } //逆序打印输出 for(i=lenc-1;i>=0;i--) printf("%d", c[i]); printf("\n"); return 0; }
http://ybt.ssoier.cn:8088/problem_show.php?pid=1307
-
C语言高精度乘法
2013-07-21 20:02:46如何用C语言写高精度乘法,高精度乘法需要用到函数调用,指针等知识 -
1307:【例1.3】高精度乘法.pdf
2019-07-26 12:33:591307:【例1.3】高精度乘法 -
高精度乘法
2011-10-23 16:38:02此程序是一个计算高精度的c++程序,使用字符方法,利用数组存储。 -
高精度乘法(高精度乘高精度)
2021-09-27 15:54:10说实话我刚开始学高精度的时候觉得挺难的 ,写了代码之后才感觉其实高精度乘法还是比较简单的,就是代码量稍稍有点大。 接下来进入正题 先上张图 没错应该看的出来,高精度乘法其实就是一位一位去乘,然后按位...第一次发博客,也不知道讲些什么,就分享一下高精度这一块的吧。
说实话我刚开始学高精度的时候觉得挺难的 ,写了代码之后才感觉其实高精度乘法还是比较简单的,就是代码量稍稍有点大。
接下来进入正题
先上张图
没错应该看的出来,高精度乘法其实就是一位一位去乘,然后按位存储在数组里面,思路差不多就是这样。
由于位数比较多,我们用字符串来进行输入,处理后按位存到整型数组中。
我们用下标来确定存数组的位置,从图中也可以看出a[i]*b[j]就存在[i + j - 1]的位置上,然后每一位都进行累加(这里的累加是指同一位的累加,如a[2]*b[1]和a[1]*b[2]是存在同一位上的,就是都在c[2]中进行累加),累加完毕后再处理进位,最后倒序输出就可以噜~
听着是不是灰常的
简单易懂【手动滑稽】话不多说,上代码
#include <iostream> using namespace std; int a[1005] , b[1005], c[2005]; string x, y; int main(){ cin >> x >> y; int a1 = x.size(); int b1 = y.size(); int c1 = a1 + b1; for(int i = 0; i < a1; i++){ a[a1 -i -1] = x[i] - '0';//输入第一个数 } for(int i = 0; i < b1; i++){ b[b1 -i -1] = y[i] - '0';//输入第二个数 } for(int i = 0; i < a1; i++){ for(int j = 0; j < b1; j++){ c[i + j] += a[i] * b[j];//按位相乘并累加 } } int x = 0; for(int i = 0; i < c1; i++){//处理进位 c[i] += x; x = c[i]/10; c[i] %= 10; } int k = c1;//两数相乘后的位数不会超过两数位数相加之和,所以c1足够了 while(c[k]==0 && k > 0){//处理前缀0 k--; } for(int i = k; i >= 0; i--){//倒序输出 cout << c[i]; } return 0; }
对了,刚才忘说了一点,输出时要处理一下前缀0!!!(希望你们别白嫖了代码就走导致没看到这句话)
好吧这句话其实不用我说看了代码就知道 -
1136高精度乘法.cpp
2019-09-29 21:05:36高精度,是学C语言漫长的路上必须要学的一类程序,菜鸡博主大一刷OJ时候的存货 -
c++高精度乘法.cpp
2021-05-01 15:25:06c++用高精度实现乘法 -
C++ 的高精度乘法
2020-02-21 15:52:31为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据,C++ 没有对应的数据类型进行表示。...高精度乘法计算原理 在读小学时,我们做乘法都采用竖式方法,如图 1 ... -
793 高精度乘法(高精度乘法模板)
2021-11-20 15:31:08对于python语言来说其实可以不用高精度乘法,直接使用两个数字相乘也不会溢出,而且直接计算的速度更快,而对于其他语言来说则需要使用高精度乘法才不会出现溢出的情况。 3. 代码如下: c++代码(c++与python的运行... -
高精度高精度乘法(C++)
2021-08-04 22:29:31今天咱们的主角是高精度高精度乘法 咱们先回顾一下竖式乘法 我们先不急着进位,先来看看,对应位置上的数字都是这么来的。 对于不足位我们补充零后,不难发现,对应位置的最后答案,是由该位置起以后的全部... -
c语言高精度乘法
2020-12-03 21:18:36高精度乘法 众所周知,由于整型数不能满足过大数的运算,所以,在进行过大数的乘法运算时需要运用一种新的方法------高精度乘法。 下面我将介绍大数相乘的几个步骤。 1.输入两个乘数,并定义后面需要到的变量 #... -
高精度乘法实现
2013-06-02 19:39:50一般的乘法大家都会计算,但是如果数据位十几亿,上百亿乃至上万亿相乘怎么办?这就需要高精度算法的技术了。本文档包含高精度乘法的具体实验代码,经过严格测试后的实验结果。非常有用哟 -
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语言
2021-01-04 16:05:28高精度乘法 为什么需要高精度乘法 原因: 首先我们看一看C语言用到的表示整数的数据类型 1.int 2.long int 3.long long int 即使是最大的long long int 类型能表达的位数依然有限 所以需要该表处理更大数据的策略 ... -
1307:【例1.3】高精度乘法(一本通)
2020-10-09 21:10:441307:【例1.3】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 24445 通过数: 8560 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正整数... -
高精度乘法运算及总结
2022-01-29 14:00:53高精度乘法运算,及其和加法运算的比较 -
高精度乘法(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;... -
C语言实现 蓝桥杯 算法提高 高精度乘法
2020-07-06 18:55:26试题 算法提高 高精度乘法 &...