• 大整数乘法问题


    /*
    大整数乘法问题:应用数组解决,由于计算机的精度是有限的,因此单纯使用程序设计语言提供的原子数据类型来
    完成两个大整数的乘法显然是不切实际的。可以考虑用两个数组来分别存储一些大于10的整数,这些数字按顺序
    排列在一起,分别表示一个大整数的每一位上的数字,于是大整数的储存问题就解决了。然后按照基本乘法规则
    对这两个大整数进行运算即可。
    */

    #include<iostream>
    //#include <memory>
    using namespace std;
    int* multi(int* num1,int size1,int* num2,int size2)
    {
     int size = size1 + size2;   //两个数相乘后的位数会小于两个数的位数之和
     int *ret=new int[size];    //动态申请一个数组用于存放相乘后的结果
     int i=0;
     memset(ret,0,sizeof(int) * size);   //将ret指向的数组空间赋值为0
     for (i=0;i<size2;++i)
     {
      int k=i;
      for (int j=0;j<size1;++j)
      {
        ret[k++] += num2[i]*num1[j];   
      }
     }
      for (i=0;i<size;++i)
      {
       if (ret[i]>=10)  //如果两个数中的两位相乘后之积大于10,将进位加上后面一位,将各位与本位相加
       {
        ret[i+1]+=ret[i]/10;
        ret[i] %= 10;
       }
      }
      return ret;
    }               
    int main()
    {
     int num1[]={1,2,3,4,5,6,7,8,9,1,1,1,1,1};    //第一个14位的大整数11111987654321
     int num2[]={1,1,1,2,2,2,3,3,3,4,4,4,5,5};    //第二个14位的大整数55444333222111
     int *ret=multi(num1,14,num2,14);
     for(int i =27;i>=0;i--)            //两个14位的大整数相乘后结果位小于等于28位
     {
      cout<<ret[i];
     }
     delete[] ret;
     return 0;
    }                    
  • 相关阅读:
    js正则表达式大全(2)
    Magic Trackpad 2 on win10 x64
    Google 日历短信通知没有了
    Ueditor 1.4.3 jsp utf-8版Bug修复
    [转]eclipse中build workspace的相关优化
    Hello,
    EpCloud开发日志
    为服务创建安装程序
    winform 通过WCF上传Dataset数据
    opcrcw.da.dll 和.net 4.0
  • 原文地址:https://www.cnblogs.com/fuyanan/p/3013998.html
Copyright © 2020-2023  润新知