杭电 ACM题老师出错!

2024-11-23 18:30:52
推荐回答(2个)
回答1:

这道题用你的代码 如果n=20 m=15
你看看输出多少?
是0
为什么
原因有点多
long的范围不够大
你先求x的阶乘那里就溢出了 然后s=x/y 结果取整数是0
避免溢出的方法可以这样:
x,y用双精度浮点数表示 乘一个x立即除以一个y
最后对s四舍五入输出
看代码:
#include
double sq(int *_point1,int *_point2);
void main()
{
int t;
int n,m;
int *p1,*p2;
p1=&n; p2=&m;
scanf("%d",&t);
while (t>0)
{
t--;
scanf("%d%d",p1,p2);
if (*p1<*p2) printf("0\n");
else printf("%.lf\n",sq(p1,p2));
}
}

double sq(int *_point1,int *_point2)
{
int i,j;
double s=1;
if (*_point2>*_point1/2) *_point2=*_point1-*_point2;
for(i=*_point2,j=*_point1;i>=1;i--,j--)
s*=j/(i*1.0);
return s;
}

回答2:

所有ACM程序都应该是一个无限循环,
最好的办法是这么写
while(scanf()!=EOF) //scanf里是你要输入的第一个值