Karatsuba算法C语言实现

对大数用Karatsuba进行处理,采用递归的方式,将结果储存到数组,并进行输出,这是一种分治的思想。

算法部分 

        n1=n1-1;
		n=n1+n1%2;	
		for(int i=0;i<n/2;i++)
		{
			nn*=10;	
		}
		a=num1/nn;//算法部分 
		b=num1%nn;
		c=num2/nn;
		d=num2%nn;
		t1=kra(a,c);
		t3=kra(b,d);
		t2=kra(a+b,c+d)-t1-t3;

不断递归拆分大数字。 

代码实现

#include<iostream>
#include<string>
#include "math.h"
#include<stdlib.h>
using namespace std;
//int *sum_z=(int*)malloc(sizeof(int)*30);
int sum_z[40]={0};//相乘数的最大位数 
long long kra(long long num1, long long num2)
{ 
    long long n=0;
    long long nn=1;
    long long n1=0;
    long long t1=0;
    long long t2=0;
    long long t3=0;
    long long t_2=0;
    long long t_1=0;
    long long t_3=0;
    long long k1=1;
    long long k2=1;
    long long a,b,c,d;
    long long num3=0;
    long long l=0;
    long long len=0;
    long long len1=0;
    long long sum_e=0;
    long long m_0;//记录数组最大的位置 
	if(num1>=num2)//对传入值进行判断,找出大的 
	{
		num3=num1;
	 } 
	 else
	 {
	 	num3=num2;
	 }
	while(num3>=1)//求出位数 
    {
    	num3/=10;
    	n1++;
	}

	if(num1==0&&num2==0)
	{
		return 0;
	}
	if(n1==1||n1==2)
	{   

		return num1*num2;
	}

    if(num1!=0&&num2!=0&&num1!=1&&num2!=1) 
	{
		n1=n1-1;
		n=n1+n1%2;	
		for(int i=0;i<n/2;i++)
		{
			nn*=10;	
		}
		a=num1/nn;//算法部分 
		b=num1%nn;
		c=num2/nn;
		d=num2%nn;
		t1=kra(a,c);
		t3=kra(b,d);
		t2=kra(a+b,c+d)-t1-t3;
		for(int i=0;i<n;i++) 
		{
			k1*=10;
			len1++;
		}
		for(int i=0;i<n/2;i++)
		{
			k2*=10;
			len++;
		}
		int t33[40]={0};
 	   t_3=t3;
		while(t_3>0)
		{
			
			t33[l++]=t_3%10;
			t_3=t_3/10;
		}
 	  	int t22[40]={0};
		l=len;
 	    t_2=t2;
		while(t_2>0)
		{
					t22[l++]=t_2%10;
		        	t_2=t_2/10;
		}
		l=len1;
		int t11[40]={0};
		t_1=t1;
		while(t_1>0)
		{
 	
					t11[l++]=t_1%10;
		        	t_1=t_1/10;
		}
 	
		for(int i=0;i<40;i++)//对t1,t2,t3,进行进位 
		{
			sum_e=t33[i]+t22[i]+t11[i];
			if(sum_e>=10)
			{
				if(sum_e>=20)
				{
				   t33[i+1]+=1;
				   sum_e=sum_e%10;
				}
				else
				{   
				
				   	t33[i+1]+=1;
				   sum_e=sum_e%10;
				   sum_z[i]=sum_e;
				}			
			}
			else
			sum_z[i]=sum_e;
			m_0=i; 
		}
			return t1*k1+t2*k2+t3;
	} 
}


int main(void)
{   long long a=0;
	long long b=0;
	int o=40;    
	for(int i=0;i<10;i++)
	{   printf("请输入x:");
		scanf("%lld",&a);
		printf("\n");
		printf("请输入y:");
		scanf("%lld",&b);
		kra(a, b);
		printf("两数相乘结果是\n");
	    for(int p=0;p<45;p++)
	    {
	    	if(sum_z[o]==0)
	    	{
	    		o--;
			}
		}
	    
		for(;o+1>0;o--)
	    {
			printf("%d",sum_z[o]);
			
	    }
	    printf("\n");
	    o=30;
	}
    return 0;
	
	
}

运行结果 

 

最后结果最大位数到40位,大于将溢出数组,代码很乱,请多多见谅。 

 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值