高精度-- 乘法运算题

发布时间:2019年08月30日 阅读:271 次

bLue的乘法算术题

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3512.html

题解:
注意到题目中给出的 n 最大值是 100,每个数的最大值是 9999,显然极限情况下的乘积用 int 和 long long 都是存不下的。因此我们需要模拟能存放大数的数据类型,容易想到的方法是定义一个 int 型数组 a, 每个元素存储大数的每一位数字。但是每一个元素仅存储一位数字显然有些浪费,并 且在运算中做乘法运算时,每一位数字都参与运算一次,当大数的位数较大时循环次数会比较多。 因此,我们不妨让每个元素记录 4 位数字。例如:对于一个大数 12345678987,我们从后向前每 4 位数记录到数组 a 的一个元素中,即 a[0] = 8987, a[1] = 4567, a[2] = 123。在输出时按下标从后向 前输出即可表示大数。 解决了如何存储大数的问题,剩下的就是如何做乘法了。容易想到的思路是模拟手算竖式乘法,但 是稍有不同的是我们将每 4 位数存储到一个数组元素中当作一位,所以我们的进位设定为逢万进 一。例如: 

  _36230 

x   ____8

 289840 

对于 36230 x 8 ,我们的被乘数是 36230,即 a[0] = 6230, a[1] = 3,乘数是8。和传统竖式乘法不 同的是,我们每 4 位数做一次运算,即首先运算 6230 x 8 = 49840,逢万进一,进位为 4,进位后 a[0] 为 9840。之后计算下一个位,3 x 8 = 24,加上进位为 a[1] = 24 + 4 = 28,进位为 0。至此 a 中元素全部运算完毕,按数组下标逆序输出即为结果 289840。 按照这个思路,即可轻松地处理本题的大数运算问题。 

参考代码:http://paste.ubuntu.com/23657880/


#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    //cin>>n;
    int i,len,ans,jump,a[19900],num;
    while(cin>>n)
    {



        a[0] = 1;
        len =1;
        while(n--)
        {
              scanf("%d",&num);
                   jump = 0;
            for(i=0; i<len; i++)
            {
                ans = a[i]*num+jump;
                a[i] = ans%10000;
                jump = ans/10000;
            }
            a[i] = jump;
            if(jump)len++;
        }
        cout<<a[len-1];
        for(i=len-2;i>=0;i--){
            printf("%04d",a[i]);
        }
        printf("\n");



    }
    return 0;
//    for(int i=1;i<=n;i++)cin>>a[i];

}



//#include <iostream>
//#include<bits/stdc++.h>
//using namespace std;
//int board[500];
//const long long inf = 1e18;
//long long getsum(){
//  long long ans =0;
//  ans+=board[0]*board[1]*board[2]*board[3];
//  ans+=board[4]*board[5]*board[10]*board[11];
//  ans+=board[8]*board[9]*board[14]*board[15];
//  ans+=board[6]*board[7]*board[12]*board[13];
//  ans+=board[16]*board[17]*board[18]*board[19];
//  ans+=board[20]*board[21]*board[22]*board[23];
////  ans+=board[12]*board[13]*board[14]*board[15];
//
//  return ans;
//}
//void Swap(int a,int b,int c){
////    s
//}
//void Right(){
//
//}
//void Left(){
//}
//void Up(){
//}
//void Down(){
//}
//void Behind(){
//
//}
//void Front(){
//
//}
//int Ans  = 0;
//void DFS(int ){
//
//    long long sum = getsum();
//    if(sum>Ans){
//
//    }
//    if(tp==5)return ;
//
//}
//int main()
//{
//
//    for(int i=0;i<24;i++)
//        scanf("%d",&board[i]);
//
//    return 0;
//}


Tag:
相关文章

发表评论: