【3003】&&【9105】高精度求积 【高精度压位】

来源:互联网 发布:mysql minpoolsize 编辑:程序博客网 时间:2024/04/26 14:57

高精度求积

Time Limit: 10 second
Memory Limit: 2 MB

问题描述
输入两个高精度正整数m和n(m和n均小于100位),求这两个高精度的积

Input

文件输入两行,第一行输入m的值,第二行输入n的值

Output

输出积,最后不带任何符号(不用换行)

Sample Input

363

Sample Output

108

 

【题解】

代码提供的是4位的压位。5位压位会导致一个点通过不了。应该是做乘法的时候溢出了。用了unsigned long long 。。。

【代码】

提供一张图片供理解。

 

#include <cstdio>#include <string>#include <iostream>using namespace std;const int MAXN = 800;string s1,s2;int l1,l2,l3;unsigned long long  ta[MAXN],tb[MAXN],a[MAXN],b[MAXN],c[MAXN];void input_data(){    cin >> s1;    cin >> s2;    l1 = s1.size();    l2 = s2.size();    for (int i = 1;i <= l1;i++) //ta和tb用于以不压位的形式存储输入的数据        ta[i] = s1[l1-i] - '0';    for (int i = 1;i <= l2;i++)        tb[i] = s2[l2-i] - '0';    for (int i = 1;i <= l1 / 4;i++) //4个数字4个数字地存入相应的a和b数组.        a[i] = ta[4*i]*1000 + ta[4*i-1]*100 + ta[4*i-2]*10 + ta[4*i-3];    int a1 = l1 / 4;    int d = l1 % 4; //有时候不会刚好数的长度为4的倍数,会有剩下的。直接放到最后面。    if (d != 0)        {            int now = 0;            for (int i= 1; i <= d;i++) //获取剩余的数字                    now = now*10 + ta[l1-i+1];            a1++;            a[a1] = now;//存入a数组中        }    for (int i = 1;i <= l2 / 4;i++) //b数组也是同样的步骤        b[i] = tb[4*i]*1000 + tb[4*i-1]*100 + tb[4*i-2]*10 + tb[4*i-3];    int b1 = l2 / 4;    int re = l2 % 4;    if (re != 0)        {                int dd = 0;                for (int i = 1;i <= re;i++)                    dd = dd*10 + tb[l2-i+1];                b1++;                b[b1] = dd;        }    l3 = l1 + l2 ;}void get_ans(){    for (int i = 1 ;i <= MAXN - 20;i++)        c[i] = 0;    for (int i = 1;i <= l1;i++)        for (int j = 1;j <= l2;j++)            c[i+j-1] = c[i+j-1] + a[i]*b[j]; //c[i+j-1]+=a[i]*b[j] 这是高精度乘法的通用步骤    for (int i = 1;i <= l3;i++) //接下来开始进位,和普通的高精度乘法有所不同。        if (c[i] >= 10000)            {                c[i+1] = c[i+1] + (c[i] / 10000);                c[i] = c[i] % 10000;            }    while (c[l3+1] >0)        {            l3++;            c[l3+1] = c[l3+1] + (c[l3] / 10000);            c[l3] = c[l3] / 10000;        }    while (c[l3]==0 && l3>0) l3--; //防止位数超过了实际位数。做一下检验工作。}void output_ans(){    printf("%d",c[l3]); //最高位前面是不会有多余的0的,所以直接输出。如a[1]=462 a[2]=56  l3=2 a[l3] = 56 这个时候你不能在56前面加0.而465前要加0    //最后结果就是560462    for (int i = l3-1;i >= 1;i--) //控制一下输出就可以了。        {            if (c[i] >= 1000)                {                    printf("%d",c[i]);                    continue;                }            if (c[i] >= 100)                {                    printf("0%d",c[i]);                    continue;                }            if (c[i] >= 10)                {                    printf("00%d",c[i]);                    continue;                }            if (c[i] >=1)                {                    printf("000%d",c[i]);                }            printf("0000");        }}int main(){    input_data();    get_ans();    output_ans();    return 0;}


 

0 0
原创粉丝点击