大整数相乘

本文介绍了一种实现大整数相乘的算法,并通过C语言详细展示了其实现过程。该算法适用于当整数超出标准数据类型所能表示的范围时的情况。

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

这是一道经典的上机题目

 

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

#define N 100  //N代表乘数的位数,根据具体应用,想设多大设多大。
/*****
 * Function: 大整数相乘算法
 * 参数:
 *  a: 乘数
 *  b: 乘数
 *  n: a的长度
 *  m: b的长度
 * 没有返回值,结果直接放到全局变量res数组中,如果不想要全局变量,也可以在函数中多加一个参数,保存结果。
 *****/
void swap(char *s,int p,int r)
{
     char ct;
     int i,j;
     for(i=p,j=r;i<j;i++,j--)
     {
          ct=s[i];
          s[i]=s[j];
          s[j]=ct;     
          }
} 
void Multiply(char *a,char *b,int n,int m,char *ret)            // 大整数相乘
{
    int i,j,temp,t,tt;
    int num;
    for(i=0;i<m;i++)
    {
        temp=0;
        for(j=0;j<n;j++)
        {    
            t=(a[n-1-j]-'0')*(b[m-1-i]-'0')+temp;
            if(0 == t)    
                continue;                
            num = j+i;        
            tt = ret[num]+(t);    
            ret[num] = tt%10;    
            temp = tt/10;
        }
        if( temp > 0 )
        {
            ret[++num] += temp;
        }
    }
    swap(ret,0,num);
    for(i=0;i<=num;i++)
    ret[i]+='0';
}
void  LargeMutiply(char *s1 ,char *s2 ,char *ret)
{
      
      int i,j;;
      for(i=0;i<2*N+1;i++)
      {
        ret[i]=0;
      }
      
      if('-'!=s1[0] && '-'!=s2[0])
      {
          Multiply(s1,s2,strlen(s1),strlen(s2),ret);
          return;
      }
      if('-'==s1[0] && '-'==s2[0])
      {
            Multiply(s1+1,s2+1,strlen(s1+1),strlen(s2+1),ret);         
            return;
      }
      i=1;
      j=0;
      if('-' != s1[0])
      {
          i=0;
          j=1;
      }
           ret[0]='-';
           Multiply(s1+i,s2+j,strlen(s1+i),strlen(s2+j),ret+1);         
           return;
}
int main()                             //  a simple test
{
    char a[N+2],b[N+2];//之所以加2,为‘-’站位,以及NULL
    char  ret[N+N+2];
    gets(a);
    printf("*"); 
    gets(b);
    printf("=");
    int len1 = strlen(a);
    int len2 = strlen(b);
    LargeMutiply(a,b,ret);
    puts(ret);
    //gets 和 puts  是获得字符串的函数 
    system("pause");
    return 0;
}


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值