大整数乘法---C语言实现

一.前言

如上

二.内容

在科学计算中,无法计算非常大的整数,于是就有大整数乘法问题。
(int存放4字节,float…已有的数据类型数据范围有限),硬件无法实现,只能靠软件(代码)实现了。

三.代码

#include<stdio.h>
#include<string.h>

int main(){
	int i,j;//循环变量 
	char char1[256],char2[256];//存放两个大整数的字符 
	int int1[256],int2[256];//按低位到高位存放两个大整数的数组 
	int result[256];//乘积结果数组 ,按低位到高位存放
	int d;//进位
	int b;//存放按位乘的结果 
	int m;//结果数组的下标 
	int len_result;
	//获取两个大整数 
	gets(char1);
	gets(char2);
	
	//按低位到高位存放两个大整数 
	for(i=0,j=strlen(char1)-1;i<strlen(char1);i++,j--){
		int1[j]=char1[i]-48;
	}
	
	for(i=0,j=strlen(char2)-1;i<strlen(char2);i++,j--){
		int2[j]=char2[i]-48;
	}
	
	//将结果数组赋初值 
	for(i=0;i<256;i++){
		result[i]=0;
	}
	
	//char字符数组长度等于对应的int字符数组长度 
	//模拟竖式相乘
	for(i=0;i<strlen(char2);i++){
		d=0;//一开始相乘,进位为0 
		m=i;
		for(j=0;j<strlen(char1);j++){
			b=int2[i]*int1[j]+d+result[m];
			result[m]=b%10;//本位
			m++;//为下一次做准备
			d=b/10;//进位 
		}
		
		if(d>0){//一次相乘,最后一次的进位 
			result[m]=d;	
		} 
	} 
	//输出结果
	len_result=strlen(char1)+strlen(char2);
	while(result[len_result]==0&&len_result>0) { // 删除前导符0
		len_result--;
	}
	for(i=len_result;i>=0;i--) {
		printf("%d",result[i]) ;
	}
	return 0;
}
  • 14
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
分治法是一种算法设计策略,通过将问题分解成更小的子问题,再通过将解合并起来来解决原始问题。在大整数乘法问题中,可以使用分治法来提高算法效率。 下面是一个使用C语言编写的分治法大整数乘法的代码示例: #include <stdio.h> #include <math.h> long long int power(int a, int b) { if (b == 0) { return 1; } else { return a * power(a, b - 1); } } long long int multiply(long long int x, long long int y) { int n; if (x < 10 || y < 10) { return x * y; } n = fmax(log10(x) + 1, log10(y) + 1); int m = ceil(n / 2.0); long long int a = x / power(10, m); long long int b = x % power(10, m); long long int c = y / power(10, m); long long int d = y % power(10, m); long long int ac = multiply(a, c); long long int bd = multiply(b, d); long long int ad_bc = multiply(a + b, c + d) - ac - bd; return ac * power(10, 2 * m) + ad_bc * power(10, m) + bd; } int main() { long long int x, y; printf("请输入两个整数:"); scanf("%lld %lld", &x, &y); long long int result = multiply(x, y); printf("两数乘积为:%lld\n", result); return 0; } 在这个代码示例中,使用了递归来实现分治法的思想。首先判断输入的两个数是否小于10,如果是,则直接返回乘积。如果不是,则计算出这两个数的位数n,然后取n的一半向上取整得到m。分别将两个数的高位和低位等分为a、b、c、d四部分。 接着,使用递归调用multiply函数来计算ac、bd和ad_bc三个结果,最后将这三个结果按照指定的规则相加得到最终的乘积。 通过使用分治法,可以显著提高大整数乘法的效率。因为将问题分解成更小的子问题,每个子问题处理的数据规模更小,计算量相对减少,从而提高了算法的效率。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无言月梧桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值