大整数乘法

//大整数乘法

//算法思想:
//1.以字符串形式接收大数 , 转换成整型数组
//  转换过程说明(字符数组四位对应整型数组一位 ,整型数组低位保存大数的低位)
//  e.g   输入  s = 123456789  转换成整型数组  a[1000]
//  a[0] 保存整型数组长度(此例为3) , a[1] = 6789 ; a[2] = 2345 ; a[3] = 1 ;
//2.每次从乘数中选一位,与被乘数的各位相乘,结果保存在result[i+j-1];
//3.处理进位 , 处理长度
//4. 输出,此过程要考虑两种情况: 一,最后为0 ,输出0 (处理不当,会输出0000)
//                                                  二,中间为0 ,1...

//e.g : result[1] = 11;     result[2] = 12 ;     result[3] = 1111;
//输出结果应该是 1100121111 , 处理不当会出现 11121111 错误

//2009.8.9
#include <iostream>
#include <string>
#include <cmath> //ceil 向上取整 floor 向下取整
using namespace std;
const double SIZE = 4.0;
int SIGN = 0; //符号位


void Inti (string &ss1 , int s1[])
{
   //符号位处理
   if (*ss1.begin()  ==  '-')
   {
       SIGN++;
       ss1.assign(ss1 , 1 , ss1.length() - 1); //删除负号
   }
   //向上取整,取整型数组长度
   s1[0]  =  ceil (ss1.length() / SIZE) ;       
   int  j = ss1.length() - 1;
   for  (int i = 1 ; i  <=  s1[0] ; i++)
   {
       int k = 0 , m  = 1;
       while (j  >=  0)
       {
           s1[i]  +=  (ss1[j]  -  '0') * m;
           m  *=  10;  k++;  j--;
           if (k  ==  SIZE) break;
      }
  }
}


//相乘函数
void Multipication  (int s1[] ,  int s2[] , int s3[])
{
   //粗略估计结果长度
   s3[0] = s2[0] + s1[0];
   //相乘过程 ,处理进位

   //之前写的是大数相乘后,在重新扫描一遍处理进位,

   //经过 fx397993401 的提醒,改成在相乘的同时处理进位
   int flag = 0;
   for (int i = 1; i <= s1[0]; i++)
          for (int j = 1; j <= s2[0]; j++)
          {
                 int k = i + j - 1;
                 s3[k]  +=  (s1[i] * s2[j] + flag);
                 if (s3[k]  >  9999)
                 {
                       flag  =  s3[k] / 10000;
                       s3[k]  %=  10000;  
                 }
                 else         flag  =  0;
          }


   //处理长度
   for (i = s3[0]; i > 0; i--)
   {
       if (s3[i]  ==  0)  s3[0]--;
       else   break;
   }

 

   //输出处理
   if (SIGN == 1)  //处理符号
       cout<<"-";
   i = s3[0];
   if (i  ==  0)  //处理为0结果
      cout<<"0"<<endl;
   else
   {
      for (; i > 0; i--)
      {
          if (i  ==  s3[0])
              printf ("%d" , s3[i]);
          else
              printf ("%04d",s3[i]);
      }
      cout<<endl;
   }
   SIGN = 0;
}

 

 

//主函数

int main()
{
    while (1)
    {
       string ss1 , ss2;
       cin>>ss1>>ss2;
       int s1[1000] = {0}, s2[1000] = {0};
       int result[1000] = {0};
       Inti (ss1 , s1);     Inti (ss2 , s2);
       Multipication  (s1 ,  s2 , result);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值