在zoj做题,要用到定义一个排列的函数,虽然是题目理解错了,但暴露以前while(n--)认识的严重不足。
如定义一个排列函数,
#include<stdio.h>
#include<math.h>
double cmn(int m,int n)
{
int t;
double s=1.0;
if(n==0||n==m)
s=1.0;
else
{
t=n;
while(t--)
s*=(double)(m-t+1)/(double)t;
}
return(s);
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b))
printf("%0.0lf/n",cmn(a,b));
return 0;
}
无论输入什么什么,结果均为1, 而把
t=n;
while(t--)
s*=(double)(m-t+1)/(double)t;
改为
for(i=1;i<=n;i++)
s*=(double)(m-t+1)/(double)t;
就能算出结果。思维在这里短路。
最后边了一个测试函数
#include<stdio.h>
int main()
{
int a;
while(scanf("%d",&a))
while(a--)
printf("%d ",a);
return 0;
}
才发现问题,编译器没问题,是自己没有理解清楚,像输入6,会输出5,4,3,2,1,0。而不是6,5,4,3,2,1.而double会自动屏蔽0。以前做题要求测试数目时经常while(n--),个数没变,所以看不出问题。以后一定要搞明白!
知道后改为下面的就可以了
t=n;
while(t--&&t)
s*=(double)(m-t+1)/(double)t;