zoukankan      html  css  js  c++  java
  • HDU 1402 A * B Problem Plus 高精乘法(数位压缩)

    HDU - 1402
     1 /***********************************************
    2 *
    3 * HDU - 1402 (高精乘法 - 数位压缩)
    4 *
    5 * 题意:
    6 * 求两个5w位数的乘法
    7 *
    8 * 思路:
    9 * 把9个1位数压缩成1个9位数
    10 * 相当于1个5W位数变成了1个6K位数
    11 * 复杂度变成了: 6000 * 6000 = 3600W
    12 * 杭电提交: 900+MS 低空掠过
    13 * 网上的一般都是快速FFT变换,有空学学
    14 *
    15 ***********************************************/
    16
    17 #include <algorithm>
    18 #include <iostream>
    19 #include <string.h>
    20 using namespace std;
    21
    22 #define N 13000
    23 #define M 51000
    24 #define LLD __int64
    25
    26 LLD a[N], b[N], ans[N];
    27 char ca[M], cb[M];
    28
    29 int StrToNum(char c[], LLD num[]) //将字符串转成数字
    30 {
    31 int n = strlen(c), k=0;
    32 LLD tp=0, p=1, d=1;
    33 for(int i=0, j=n-1; i<n; i++, j--)
    34 {
    35 tp += (LLD)(c[j] - '0') * d; //注意数字的顺序,合成一个数也是从低位到高位
    36 if(p>=9) //把9个1位数压成1个9位数,减少循环
    37 {
    38 num[k++] = tp;
    39 tp = 0;
    40 p = d = 1;
    41 }else{
    42 p++;
    43 d*=10;
    44 }
    45 }
    46 num[k++] = tp;
    47 // for(i=0; i<k; i++)
    48 // printf("%I64d ", num[i]);
    49 // printf(" yes\n");
    50 return k;
    51 }
    52
    53 int main()
    54 {
    55 int na, nb, n, t, d=0, i, j;
    56 const int width = 9;
    57 LLD MOD = (LLD)(1e9); //9位的模数
    58 while(scanf("%s%s", ca, cb)!=EOF)
    59 {
    60 memset(a, 0, sizeof(a));
    61 memset(b, 0, sizeof(b));
    62 na = StrToNum(ca, a);
    63 nb = StrToNum(cb, b);
    64 memset(ans, 0, sizeof(ans));
    65
    66 for(i=0; i<na; i++)
    67 {
    68 for(j=0; j<nb; j++)
    69 {
    70 ans[i+j] += a[i]*b[j];
    71 }
    72 for(j=0; j<nb; j++)
    73 {
    74 if(ans[i+j]>=MOD)
    75 {
    76 ans[i+j+1] += ans[i+j] / MOD;
    77 ans[i+j] %= MOD;
    78 }
    79 }
    80 }
    81
    82 n = i + j + 2;
    83 while(!ans[n] && n>0) n--;
    84 if(n>=0) printf("%I64d", ans[n--]);
    85 while(n>=0) printf("%0*I64d", width, ans[n--]);
    86 printf("\n");
    87 }
    88 return 0;
    89 }


    门卫大叔每两天会换一个

    有一个很面善,人很好,就算我们1点多回去,他也不会说我们什么

    还有一个。。。实在没话说。。问了我们半天。。又凶又凶又凶。。。

    不过话说回来,我们先扰他们清梦先的。。  还是有点说不过去。。

  • 相关阅读:
    js_阶乘
    python 最新方案-解决编码错误问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position
    RabbitMQ Python端发送消息给Java端 接受消息全数字问题
    【Hadoop】第六天 Hive
    【Hadoop 】第五天 Hadoop-HA 搭建
    Redis面试常问点
    python md5 salt 摘要算法
    【Hadoop】第四天 Shuffle MapReduce组件全貌
    【Hadoop】第三天 mapreduce的原理和编程
    【Hadoop 】第二天 hdfs的原理和使用操作、编程
  • 原文地址:https://www.cnblogs.com/Nstd/p/2251889.html
Copyright © 2011-2022 走看看