zoukankan      html  css  js  c++  java
  • ZOJ 2061 Buy the Ticket

    典型的高精度题,本着“和平共处五项原则”,我抄了一下ZXPN的代码,不过略加改进,中间也出了点问题,忘了算fac[0]了。

      1 #include<stdio.h>
      2 #include<string.h>
      3 char dp[105][105][500],fac[105][200];
      4 void add(char *s1,char *s2,char *s3)
      5 {//s3 = s1 + s2
      6     int len1 = strlen(s1);
      7     int len2 = strlen(s2);
      8     int a[10000];
      9     int k = len1 > len2 ? len1 : len2;
     10     int i,j;
     11     for(i = 0;i <= k;i++)
     12         a[i] = 0;
     13     for(i = len1 - 1,j = k;i >= 0;i--,j--)
     14     {
     15         a[j] = s1[i] - '0';
     16     }
     17     for(i = len2 - 1,j = k;i >= 0;i--,j--)
     18     {
     19         a[j] = a[j] + s2[i] - '0';
     20         a[j - 1] = a[j - 1] + a[j] / 10;
     21         a[j] %= 10;
     22     }
     23     if(a[j] >= 10)
     24     {
     25         a[j - 1] = a[j] / 10;
     26         a[j] %= 10;
     27     }
     28     i = 0;
     29     if(a[0] == 0)
     30         i = 1;
     31     for(j = i;j <= k;j++)
     32         s3[j - i] = a[j] + '0';
     33     s3[j - i] = '\0';
     34 }
     35 void mul(char *s1,char *s2,char *s3)
     36 {//s3 = s1 * s2
     37     int len1 = strlen(s1);
     38     int len2 = strlen(s2);
     39     int a[10000];
     40     int k = len1 + len2 - 1;
     41     int i,j;
     42     for(i = 0;i <= k;i++)
     43         a[i] = 0;
     44     for(i = len1 - 1;i >= 0;i--)
     45     {
     46         for(j = len2 - 1;j >= 0;j--)
     47         {
     48             a[i + j + 1] += (s1[i] - '0') * (s2[j] - '0');
     49             a[i + j] += a[i + j + 1] / 10;
     50             a[i + j + 1] %= 10;
     51         }
     52     }
     53     if(a[1] >= 10)
     54     {
     55         a[0] = a[1] / 10;
     56         a[1] %= 10;
     57     }
     58     i = 0;
     59     if(a[0] == 0)
     60         i = 1;
     61     for(j = i;j <= k;j++)
     62         s3[j - i] = a[j] + '0';
     63     s3[j- i] = '\0';
     64 }
     65 void facmul(char *s1,int n,char *s2)
     66 {//s2 = s1 * n
     67     int l,k,i,j,t,f=0;
     68     l = strlen(s1);
     69     k = l + 2;//本题n最大为100
     70     for(i = 0; i < k; i++)
     71         s2[i] = 0;
     72     for(i = l-1,j = k-1; i >= 0; i--,j--)
     73     {
     74         t = (s1[i]-'0') * n;
     75         s2[j] += t % 10;
     76         s2[j-1] += t / 10;
     77         if(s2[j] > 9)
     78             s2[j-1] += s2[j]/10,s2[j] %= 10;
     79     }
     80     if(s2[1] > 9)
     81         s2[0] += s2[1]/10,s2[1] %= 10;
     82     while(s2[f] == 0)
     83         f++;
     84     for(i = 0; i < k-f; i++)
     85         s2[i] = s2[i+f]+'0';
     86     s2[k-f] = '\0';
     87 }
     88 int main()
     89 {
     90     int i,j,a,b,n=1;
     91     strcpy(fac[0],"1");
     92     for(i = 1; i <= 100; i++)
     93         facmul(fac[i-1],i,fac[i]);
     94     for(i=0;i<=100;i++)
     95         strcpy(dp[i][0],"1");
     96     for(i=1;i<=100;i++)
     97         for(j=1;j<=i;j++)
     98             if(i==j)
     99                 strcpy(dp[i][j],dp[i][j-1]);
    100             else
    101                 add(dp[i][j-1],dp[i-1][j],dp[i][j]);
    102     for(i = 0;i <= 100;i++)
    103         for(j = 0;j <= i;j++)
    104         {
    105             mul(dp[i][j],fac[i],dp[i][j]);
    106             mul(dp[i][j],fac[j],dp[i][j]);
    107         }
    108     while(~scanf("%d%d",&a,&b),a||b)
    109     {
    110         printf("Test #%d:\n",n++);
    111         if(a < b)
    112             printf("0\n");
    113         else
    114             printf("%s\n",dp[a][b]);
    115     }
    116     return 0;
    117 }
  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/2477947.html
Copyright © 2011-2022 走看看