WA了好多次,最后终于发现是大数输出的时候出了问题
这里大数的输出要去除前导0,同时后面的输出要把后4位都输出
如:
00040004
要先用一个printf("%d");输出最前面的数
然后用printf("%04d");输出该数的前4位,包括0
#include<stdio.h>
#include<string>
using namespace std;
int fact[205][101];
void multiply(int* a,int b) {//大数乘小数
int i,temp=0;
for(i=100;i>=0;i--) {
temp+=b*a[i];
a[i]=temp%10000;
temp/=10000;
}
}
void Fact() {
fact[0][100]=fact[1][100]=1;
int i;
for(i=2;i<=200;i++) {
memcpy(fact[i],fact[i-1],101*sizeof(int));
multiply(fact[i],i);
}
}
void divide(int* a,int b) {
int i,temp=0;
for(i=0;i<101;i++) {
temp=temp*10000+a[i];
a[i]=temp/b;
temp%=b;
}
}
void output(int *a) {
int i=0;
while(i<101 && a[i]==0) i++;
printf("%d",a[i++]);//去除大数前导0
while(i<101) printf("%04d",a[i++]);//输出4位
printf("\n");
}
int main() {
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
int m,n;
Fact();
int t=1;
int res[101];
while(scanf("%d%d",&m,&n),m+n) {
//if (m==0 && n==0) break;
printf("Test #%d:\n",t++);
if (n>m) {
printf("0\n");
continue;
}
memcpy(res,fact[m+n],101*sizeof(int));
multiply(res,m-n+1);
divide(res,m+1);
output(res);
}
return 0;
}