高精度计算(四):大整数乘法(采用“万进制”)

【例1】大整数乘法。

编写一个程序,求两个不超过200 位的非负整数的积。

(1)编程思路。

大整数乘大整数,实质就是在小学竖式乘法的基础上枚举各个乘数位与被乘数相乘,累加到结果当中。其中乘数中的第j位与被乘数中的第i位相乘时,结果应该保存到结果的第i+j-1位中。

(2)源程序。

#include <iostream>
using namespace std;
const int base=10000;
const int maxlen=50+2;
void charTobignum(char *ch,int *bignum)
{
      int len,i,j,p,num;
      memset(bignum,0,sizeof(int)*maxlen);
      len=strlen(ch);
      bignum[0]=len%4==0?len/4:len/4+1;
      i=1;
      while (i<=len/4)
      {
          num=0;
          p=len-4*i;
          for(j=1;j<=4;j++)
              num=num*10+(ch[p++]-‘0‘);
          bignum[i]=num;
          i++;
       }
       if (len%4!=0)
       {
            num=0;
            for (i=0;i<=len%4-1;i++)
                 num=num*10+(ch[i]-‘0‘);
            bignum[len/4+1]=num;
        }
}
void printbignum(int *bignum)
{
       int *p=*bignum+bignum;
       cout<<*p--;
       cout.fill(‘0‘); // 定义填充字符‘0‘
       while(p>bignum)  { cout.width(4); cout<<*p--; }
       cout<<endl;
}
void multiply( int *bignum1, int *bignum2, int *bignum_ans)
{
      int carry=0, i, j;
      memset(bignum_ans, 0, sizeof(int)*2*maxlen);
      for (j=1; j<=bignum2[0]; j++){
           for(i=1; i<=bignum1[0]; i++){
               bignum_ans[i+j-1]+=carry+bignum1[i]*bignum2[j];
               carry=bignum_ans[i+j-1]/base;
               bignum_ans[i+j-1]%=base;
            }
            i=j+bignum1[0];
            while(carry){
                 bignum_ans[i++]=carry%base;
                carry/=base;
            }
       }
       bignum_ans[0]=bignum1[0]+bignum2[0];
       while( !bignum_ans[*bignum_ans] ) --bignum_ans[0];
}
int main()
{
       int bignum1[maxlen],bignum2[maxlen],bignum_result[2*maxlen];
      char numstr[maxlen];
      cout<<"请输入第1个大整数:";
      cin>>numstr;  
      charTobignum(numstr,bignum1);
      cout<<"请输入第2个大整数:";
      cin>>numstr;
      charTobignum(numstr,bignum2);
      multiply(bignum1,bignum2,bignum_result);
      cout<<"两个大整数的积是 :";
      printbignum(bignum_result);
      return 0;
}

将上面源程序中的输入输出提示语句删除后,提交给POJ 2389 “Bull Math”,可以Accepted。

原文地址:https://www.cnblogs.com/cs-whut/p/11198710.html

时间: 2024-10-09 20:14:07

高精度计算(四):大整数乘法(采用“万进制”)的相关文章

HDU1042 N!(大数问题,万进制)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1042 N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 89320    Accepted Submission(s): 26376 Problem Description Given an integer N(0 ≤ N ≤ 1

hdu-1042(大数+万进制)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 参考文章:https://blog.csdn.net/tigerisland45/article/details/51530528 题意:求n!(n<=1000)数字很大,可以用万进制来做,就是到了10000就进一,每个数字用数组存储. #include<iostream> #include<cstdio> #include<cstring> using nam

高精度计算-大整数乘法

大整数乘法 问题描述 求两个不超过 200 位的非负整数的积. 输入数据 有两行,每行是一个不超过 200 位的非负整数,没有多余的前导 0. 输出要求 一行,即相乘后的结果.结果里不能有多余的前导 0,即如果结果是 342,那么就不能 输出为 0342. 输入样例 12345678900 98765432100 输出样例 1219326311126352690000 解题思路 乘法规律,一个数的第i位和另一个数的第j位相乘,一定会累加到结果的第i+j位,结果的数组一个数组元素存2位数,最后对结

使用快速傅里叶变换计算大整数乘法

我们知道,两个 N 位数字的整数的乘法,如果使用常规的算法,时间复杂度是 O(N2).然而,使用快速傅里叶变换,时间复杂度可以降低到 O(N logN loglogN). 假设我们要计算以下两个 N 位数字的乘积: a = (aN-1aN-2...a1a0)10 = aN-1x10N-1 + aN-2x10N-2 + ... + a1x101 + a0x100 b = (bN-1bN-2...b1b0)10 = bN-1x10N-1 + bN-2x10N-2 + ... + b1x101 + b

POJ 1001 解题报告 高精度大整数乘法模版

题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于错误的判断还不够严厉. 对边界情况的讨论其实应该是思维严密的表现,当然这并不能表明我写的一点错误都没有,只是多多分析一下还是很有好处的. #include <iostream> #include <fstream> #include <string> #include &l

大整数乘法python3实现

由于python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,但是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位置开始算的.代码如下: import sys def list2str(li): while li[0]==0: del li[0] res='' for i in li: res+=str(i) return res def multi(stra,strb): aa=list(stra) bb=l

分治法解大整数乘法

在某些情况下,需要处理很大的整数,它无法在计算机中精确的表述和处理.若要精确的表示大整数,就必须使用软件的方法来实现大整数的运算.最常用的解决大整数运算的方法是使用一个二重循环,其算法时间复杂度为O(m*n)(其中m,n分别为两个大整数的长度):而选用分治方法则可以将算法时间复杂度降到O(n^(log3))(两个大整数的长度同为n).但分治方法的算法实现较为复杂,针对这个问题,本文借助标准C++实现了分治方法求解大整数乘法的算法. 下面分别介绍两种算法原理,及其实现: 1.使用二重循环控制两个数

大整数乘法问题

数组可以实现的算法很多,典型应用就是大整数相乘问题.利用的思想非常巧妙,感觉和链表实现多项式运算有异曲同工,大整数相乘主要避免计算机存储精度不够的时候.按照基本的乘法运算实现即可! 主要注意返回指针类型,和关键点k=i的技巧. /*! * \file 算法之美--大整数乘法问题.cpp * * \author ranjiewen * \date 2016/12/04 15:58 * * */ #include <iostream> using namespace std; #define SI

题目:大整数乘法、除法,楼梯走法,数组中不同数字,超过一半数字(好)

大整数乘法,可以用单个数字想乘,跟踪进位信息来处理. 大整数除法,可以先把除数增大到跟被除数相同的量级,然后累计相减.比如 555 / 3,就先把3增大到300,555能够减1次,那么结果+100,被除数变成255,依次进行. 楼梯走法:一次走一级,或者走两级.没什么难度. 数组中不同数字:如果是2n+1数组找出不同的那个数字,用异或就可以. 如果是找出超出一般数目的数字,用遍历,看到不一样的,就一起删除,这样的方式. 上网搜了一下,找出了更好的方法: 用变量记录备选数字,一个计数器记录该数字剩