博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 2061 - Buy the Ticket
阅读量:6825 次
发布时间:2019-06-26

本文共 3158 字,大约阅读时间需要 10 分钟。

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

1 #include
2 #include
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 else101 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 else114 printf("%s\n",dp[a][b]);115 }116 return 0;117 }

 

转载于:https://www.cnblogs.com/lzxskjo/archive/2012/05/01/2477947.html

你可能感兴趣的文章
[华为机试练习题]55.最大公约数 &amp; 多个数的最大公约数
查看>>
文章标题
查看>>
对js原型对象的拓展和原型对象的重指向的区别的研究
查看>>
将数值四舍五入后格式化,带有千分位
查看>>
Atitit.反编译apk android源码以及防止反编译apk
查看>>
EF增删改查操作
查看>>
更改文件和目录的所有者
查看>>
[Angularjs]表单验证
查看>>
jquery------使用jQuery的委托方法
查看>>
Bmob后端云使用步骤
查看>>
ASP.NET Core 中间件详解及项目实战
查看>>
Android中的Uri.parse()
查看>>
安装 Express
查看>>
博客模板
查看>>
iOS开发之都兴忱小结
查看>>
TableLayout(表格布局)
查看>>
PAT1007
查看>>
hdu 5755(高斯消元——模线性方程组模板)
查看>>
2016阿里安全峰会重点资料下载
查看>>
B窗体继承于A窗体,B启动:问题点
查看>>