大数乘法

本文介绍了一种处理大数乘法的有效算法,并通过C语言实现了该算法。文章详细解释了如何利用一维数组存储大数及其乘积,并通过具体步骤展示了如何进行位运算和进位处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很容易发现这样的规律:
  1、计算结果的最后一位的下标最大,其下标之和为6;倒数第二位的下标之和为5,以此类推,第一位的下标之和是0。因此,下标之和的顺序刚好是结果位的位序,我们可以据此求出结果的各个位。
  2、最大的下标之和刚好是乘数位数和被乘数位数之和减一,结果位数是乘数位数和被乘数位数之和。据此,我们可以定义结果数组和一维数组,大小是乘数和被乘数位数之和的一维数组来存放结果。

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

#define MAX_DIGITS 100

void mulBigInteger(char*mulor,char*mulant,char*result);

int main(){
 char mulor[MAX_DIGITS+1];
 char mulant[MAX_DIGITS+1];
 char result[2*MAX_DIGITS+1];
   
 printf("%s/n","input one number");
 scanf("%s",mulor);
 printf("%s/n","input another number");
 scanf("%s",mulant);

 char *ptor = mulor;
 char *ptant = mulant;
 
 printf("mulor = %s,", mulor);
    printf("mulant = %s/n" ,mulant);

 mulBigInteger(mulor,mulant,result);
 printf("%s * %s = %s",mulor,mulant,result);

 return 0;
}

void mulBigInteger(char*mulor,char*mulant,char*result){
 char one[MAX_DIGITS];
 char two[MAX_DIGITS];
 char rel[2*MAX_DIGITS];
 int pro[2*MAX_DIGITS];

 int row = strlen(mulant);//乘数
 int col = strlen(mulor);//被乘数

 int i,j;
 strcpy(one,mulor);
 strcpy(two,mulant);

 for (i=0;i<2*MAX_DIGITS;i++)
  pro[i]=0;

 for(i = row-1; i >=0; i--)
  for(j = col-1 ; j >= 0; j--)
  {
   int product = (one[j]-'0')*(two[i]-'0');
   pro[i+j+0] += product/10 ;
   pro[i+j+1] += product%10 ;
  }

for(i = row+col-1; i>0;i--)
{
  if(pro[i]>=10)
  {
   pro[i-1] +=pro[i]/10;
   pro[i] =pro[i]%10;      
  }

}
 
 int pos =0;
 for(i = 0;i<row +col;i++)
  if (pro[i]!= 0)
  {
   pos = i;
   break;
  }
 printf("/n pos =%d/n",pos);     
 for(i = 0,j = pos;i<row +col;i++,j++)
  rel[i] = pro[j]+'0';

 
rel[row+col]='/0';
strcpy(result,rel);
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值