精华内容
下载资源
问答
  • C语言高精度乘法的实现方法
    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】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4358 通过数: 1440 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正...
  • c++高精度乘法,字符串做法,支持50000位两数相乘,希望大佬帮助改进。Thanks♪(・ω・)ノ
  • ybt 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】高精度乘法 时间限制: 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】高精度乘法
  • 高精度乘法

    2011-10-23 16:38:02
    此程序是一个计算高精度的c++程序,使用字符方法,利用数组存储。
  • 说实话我刚开始学高精度的时候觉得挺难的 ,写了代码之后才感觉其实高精度乘法还是比较简单的,就是代码量稍稍有点大。 接下来进入正题 先上张图 没错应该看的出来,高精度乘法其实就是一位一位去乘,然后按位...

    第一次发博客,也不知道讲些什么,就分享一下高精度这一块的吧。

    说实话我刚开始学高精度的时候觉得挺难的 ,写了代码之后才感觉其实高精度乘法还是比较简单的,就是代码量稍稍有点大。

    接下来进入正题

    先上张图

     没错应该看的出来,高精度乘法其实就是一位一位去乘,然后按位存储在数组里面,思路差不多就是这样。

    由于位数比较多,我们用字符串来进行输入,处理后按位存到整型数组中。

    我们用下标来确定存数组的位置,从图中也可以看出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:06
    c++用高精度实现乘法
  • C++ 的高精度乘法

    千次阅读 多人点赞 2020-02-21 15:52:31
    为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据,C++ 没有对应的数据类型进行表示。...高精度乘法计算原理 在读小学时,我们做乘法都采用竖式方法,如图 1 ...
  • 对于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】高精度乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 24445 通过数: 8560 【题目描述】 输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。 【输入】 输入两个高精度正整数...
  • 高精度乘法运算,及其和加法运算的比较
  • 高精度乘法(C++实现)

    千次阅读 2020-10-22 12:42:44
    2.高精度乘法将大数以字符串形式输入,然后拆分转换为一位一位的整数,之后按照小学的竖式运算方法完成编码。(注意:字符串中0下标从左开始,竖式运算中0下标从右开始,故代码中需要有一个逆序操作。如a[i]=s1[s1....
  • C++高精度乘法模板

    千次阅读 2018-07-09 11:15:08
    方法还是与高精度加法的方法差不多,列一个竖式,就可以发现其中的规律了。 #include &amp;amp;lt;iostream&amp;amp;gt; #include &amp;amp;lt;cstdio&amp;amp;gt; #include &amp;amp;lt;...
  • 试题 算法提高 高精度乘法                              &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,992
精华内容 15,596
关键字:

1307高精度乘法