lightoj 1024

来源:互联网 发布:sql中合计前几列的和 编辑:程序博客网 时间:2024/05/17 23:57

高精度乘法

代码如下:

#include <bits/stdc++.h>using namespace std;int b[50010], a[50010];int c[10010];void Print(int n){    memset(c, 0, sizeof(c));    int m = 1;    c[0] = 1;    for(int i = 0; i < n; i++)    {        int len = 0;        for(int j = 0; j < m; j++)            c[j] *= a[i];//        printf("%d\n", c[0]);        for(; c[len] || len < m; len++)            c[len+1] += c[len]/10, c[len] %= 10;        m = len;    }    for(int i = m-1; i >= 0; i--)        printf("%d", c[i]);    printf("\n");    return ;}int main (){//    freopen("E:\\1.in", "r", stdin);//    freopen("E:\\1.out", "w", stdout);    int t, cnt = 1;    scanf("%d", &t);    while(t--)    {        memset(b, 0, sizeof(b));        int n, len = 0;        scanf("%d", &n);        for(int i = 0; i < n; i++)        {            int x;            scanf("%d", &x);            int k = sqrt(x);            for(int i = 2; i <= k && i <= x; i++)            {                int sum = 0;                while(x%i == 0)                {                    x /= i;                    sum++;                }                b[i] = max(b[i], sum);            }            if(x != 1 && x < 50001) b[x] = max(b[x], 1);            if(x > 50000) a[len++] = x;        }        for(int i = 2; i <= 50001; i++)            if(b[i])            {                a[len] = 1;                while(b[i]--)                {                    a[len] *= i;                }                len++;            }        printf("Case %d: ", cnt++);        Print(len);    }    return 0;}