精华内容
下载资源
问答
  • 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 ;

    }

    本文来源:搜集于网络

    更多相关内容
  • 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-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);...
    #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);
        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';
        }
        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;
            }
        }
    }
    //输出数组c
    void shuchu(){
    	int i,j;
        for (j = 2999; j > 0; j--) {
            if (c[j] != 0)
            break;
        }
       	for (i = j; i >= 0; i--) {
       		printf("%d", c[i]);
       	}
    }
    int main() {
    	char numberN[150000], numberM[150000];
        scanf("%s%s", numberN, numberM);
        chengfa(numberN, numberM);
        shuchu();
    }
    
    展开全文
  • C语言实现高精度乘法

    2021-08-13 14:08:19
    大一小白尝试C语言高精度乘法 一、高精度乘法是什么 高精度乘法就是对于普通数据类型无法表示的大整数进行乘法运算。 二、为什么需要高精度乘法 在C语言中,常用的数据类型有int, long long, double等,但是这些数据...

    大一小白尝试C语言高精度乘法

    一、高精度乘法是什么

    高精度乘法就是对于普通数据类型无法表示的大整数进行乘法运算。

    二、为什么需要高精度乘法

    在C语言中,常用的数据类型有int, long long, double等,但是这些数据类型的大小有限,当输入的数据过大,这些数据类型就无法实现其功能,强行使用可能会出现错误。在这种情况下,我们需要高精度乘法来完成运算。

    三、如何实现高精度乘法

    为了更方便的理解高精度乘法,我们先从熟悉的竖式乘法开始。首先我们知道,电脑笨笨的,普通数据类型算不了大数乘法。但是小学的时候我们很聪明,学习了竖式乘法,表达是这样的。在这里插入图片描述
    过程是这样的,我们根据九九乘法表对于两位单独的数字进行运算,列在对应的位置上,最后进行累加并完成进位。

    所以理论上来说,我们可以用竖式乘法计算很大的数。

    四、实现

    于是我们有了高精度乘法的实现思路:

    1.输入

    2.各位相乘相加

    3.进位

    4.输出

    至于采取什么样的数据类型存储输入输出,答案显而易见,字符串是十分合适的。至此,我们有了大体的思路。那么就可以开始处理数据了。

    首先是输入的一些准备工作,我们需要两个字符串来存储因数,以及一个字符串来存储答案,为了方便计算,我们将char的数转变为int类型。

    void High_Precision_Multiplication(char c_number_1[], char c_number_2[], char c_answer[]) {
    	int i_number_1[Number_Size];//第一个数字
    	int i_number_2[Number_Size];//第二个数字
    	int i_answer[Number_Size];//结果
    	//可以在线处理
    	int length_1 = strlen(c_number_1);//第一个数字的位数(长度)
    	int length_2 = strlen(c_number_2);//第二个数字的位数(长度)
    	int length_3;//答案的位数
    	int i, j;
    	char temp;//用于逆转
    	memset(c_answer, 0, length_answer);
    	memset(i_number_1, 0, sizeof(i_number_1));
    	memset(i_number_2, 0, sizeof(i_number_2));
    	memset(i_answer, 0, sizeof(i_answer));
    	//完成初始化
    }
    

    逆转和数字转换

    	for (i = 0; i < length_1; i++) {
    		i_number_1[i] = c_number_1[length_1 - i - 1] - '0';
    	}
    	for (i = 0; i < length_2; i++) {
    		i_number_2[i] = c_number_2[length_2 - i - 1] - '0';
    	}
    	//完成逆转+数字转换
    

    竖式乘法

    	for (i = 0; i < length_1; i++) {
    		for (j = 0; j < length_2; j++) {
    			i_answer[i + j] += i_number_1[i] * i_number_2[j];
    		}
    	}
    	//完成相乘
    

    根据竖式乘法的规则我们知道,上面代码的第三行是成立的。

    进位

    	for (i = 0; i < length_1 + length_2 - 1; i++) {
    		if (i_answer[i] >= 10) {
    			i_answer[i + 1] += i_answer[i] / 10;
    			i_answer[i] %= 10;
    		}
    	}
    	//完成进位
    

    逆转和输出

    为了方便输出,我们将答案转换回字符,并逆转头尾

    	i = 0;
    	while (i_answer[i] || i < length_1 + length_2 - 1) {
    		i_answer[i] += '0';
    		i++;
    	}
    	//转换回字符
    	length_3 = i;
    	i = 0;
    	while (i < length_3 - i - 1) {
    		temp = i_answer[i];;
    		i_answer[i] = i_answer[length_3 - i - 1];
    		i_answer[length_3 - i - 1] = temp;
    		i++;
    	}
    	//逆转回去
    	for (i = 0; i < length_3; i++) {
    		c_answer[i] = i_answer[i];
    	}
    	//输出答案
    

    五、最后的代码

    将各部分代码合并,我们就得到了高精度乘法的函数

    void High_Precision_Multiplication(char c_number_1[], char c_number_2[], char c_answer[], int length_answer) {
    	int i_number_1[Number_Size];//第一个数字
    	int i_number_2[Number_Size];//第二个数字
    	int i_answer[Number_Size];//结果
    	//可以在线处理
    	int length_1 = strlen(c_number_1);//第一个数字的位数(长度)
    	int length_2 = strlen(c_number_2);//第二个数字的位数(长度)
    	int length_3;//答案的位数
    	int i, j;
    	char temp;//用于逆转
    	memset(c_answer, 0, length_answer);
    	memset(i_number_1, 0, sizeof(i_number_1));
    	memset(i_number_2, 0, sizeof(i_number_2));
    	memset(i_answer, 0, sizeof(i_answer));
    	for (i = 0; i < length_1; i++) {
    		i_number_1[i] = c_number_1[length_1 - i - 1] - '0';
    	}
    	for (i = 0; i < length_2; i++) {
    		i_number_2[i] = c_number_2[length_2 - i - 1] - '0';
    	}
    	//完成逆转+数字转换
    	for (i = 0; i < length_1; i++) {
    		for (j = 0; j < length_2; j++) {
    			i_answer[i + j] += i_number_1[i] * i_number_2[j];
    		}
    	}
    	//完成相乘
    	for (i = 0; i < length_1 + length_2 - 1; i++) {
    		if (i_answer[i] >= 10) {
    			i_answer[i + 1] += i_answer[i] / 10;
    			i_answer[i] %= 10;
    		}
    	}
    	//完成进位
    	i = 0;
    	while (i_answer[i] || i < length_1 + length_2 - 1) {
    		i_answer[i] += '0';
    		i++;
    	}
    	//转换回字符
    	length_3 = i;
    	i = 0;
    	while (i < length_3 - i - 1) {
    		temp = i_answer[i];;
    		i_answer[i] = i_answer[length_3 - i - 1];
    		i_answer[length_3 - i - 1] = temp;
    		i++;
    	}
    	//逆转回去
    	for (i = 0; i < length_3; i++) {
    		c_answer[i] = i_answer[i];
    	}
    	//输出答案
    	return;
    }
    

    六、结语

    这个函数接受三个char*,并将前两个数字相乘,输出到第三个字符串中,但是该函数没有输入检测,也没有输出检测。而且这个函数占用了很多不必要的内存空间,为了步骤清晰,进行了很多不必要的分划,时间效率也不高。仍有大量可以优化的空间。

    笔者是一位大一学生,因为手动实现高精度乘法的过程中出现了一些问题,因此写下这篇博客帮助理清思路。希望这篇博客能够帮助到更多刚接触C语言的同学们。如果文中有错误,欢迎指出。十分感谢各位的阅读!

    展开全文
  • 高精度乘法 C语言

    2021-01-04 16:05:28
    高精度乘法 为什么需要高精度乘法 原因: 首先我们看一看C语言用到的表示整数的数据类型 1.int 2.long int 3.long long int 即使是最大的long long int 类型能表达的位数依然有限 所以需要该表处理更大数据的策略 ...
  • C语言高精度乘法

    千次阅读 2017-04-22 21:22:43
    首先应判断两个数有没有为零,然后判断两个数之前有没有负号,如果有负号,则不考虑负号将字符串倒置转换成数字类型放入一个数组中,然后将两个数组的每一位对应相乘,进位与之前的高精度加法一样,最后输出的时候的...
  • 高精度乘法(高精乘高精)(C语言实现)

    千次阅读 多人点赞 2018-10-13 09:28:25
    高精度,是学C语言漫长的路上必须要学的一类程序 &amp;gt;&amp;gt;&amp;gt;高精度加法(C语言实现)&amp;lt;&...高精度减法(C语言实现)&...高精度乘法(高精乘低精)(C语
  • 1、为什么需要高精度乘法及其实质 我们知道,计算机内部直接用int或double等数据类型储存数字是有范围限制的,即当数据运算大小过大后,计算机将会出现溢出情况,使得计算结果不够精确。为了能够使计算机精确地计算...
  • C语言中的高精度乘法

    万次阅读 多人点赞 2015-11-06 00:22:50
    大一新生初谈C语言中的高精度乘法 1为什么需要高精度乘法及其实质 2高精度乘法原理 3高精度乘法的实现 a 运算前的准备 b一位位地运算 c处理进位 d输出结果 4整体的代码 5结语 大一新生对高精度乘法的一种通俗理解。...
  • C语言 高精度乘法

    千次阅读 2014-05-02 14:42:06
    #include #include int main() { char m[555],n[555],temp[555]; int i,j,len_m,len_n; int a[555]={0},b[555]={0},c[1111]={0}; scanf("%s",m); scanf("%s",n); if
  • 高精度乘法(高精乘低精)(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语言-高精度乘法

    2019-07-24 12:40:37
    C语言-高精度乘法题目来源思路代码 题目来源 厦门大学在线评测系统 2018级C语言程序设计实验课1388号试题 思路 考虑到涉及数据过于庞大,基本数据类型都难以记录,可以用数组记录数据,逐位计算并进位 代码 #include...
  • 这里的高精度乘法主要指按位模拟运算,实际上就是模拟乘法的过程,也就是笔算的过程。(你拿张纸就可以轻易的模拟出来,但是你原来可能没发现过其中的规律)。2,原理既然是一个很大的数,我们便不能够在用简单的数据...
  • 试题 算法提高 高精度乘法                              &...
  • 有了前面的基础,这个乘法就是小意思 #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); ...
  • 当两个数字十分巨大,没有变量可以存储时,考虑将数的每一位上的数字存储在数组中,然后模拟手动乘法的过程。 1.将数字分别按位逆序存入数组a和数组b中(逆序实现数字到数组比较简单,且方便接下来的运算) 2.c数组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,532
精华内容 2,612
关键字:

c语言高精度乘法