/*h*/
#include <stdio.h>
#include <math.h>
double hanshu(int n,int m);
int main()
{
int n,m;
int i,j,k;
scanf("%d",&n);
for (i=1;i<=n-1;i++)
printf("%10.0lf",hanshu(n,i));
return 0;
}
double hanshu(int n,int m)
{
int i,j,k;
double n1=1,m1=1;
int s1=0,s2=0;
if (n<16)
{
if (m<n/2+1)
{
n1=1;m1=1;
for (i=0;i<m;i++)
n1*=(n-i);
for (i=1;i<=m;i++)
m1*=i;
return (n1/m1);
}
else
{
return hanshu(n,n-m);
}
}
else
{
//这里虽然解决了大数问题,但有误差.解决方法:
//http://blog.csdn.net/zhuCsustICPC/archive/2010/06/15/5671860.aspx
if (m>n/2)
m=n-m;
for (i=m+1;i<=n;i++)
s1 += log((double)i);
for (i=2;i<=n-m;i++)
s2+=log((double)i);
return exp(s1-s2);
}
}
/下面是正确的。。。
/数据类型问题。。。
/vc++环境下 double的取值范围远大于long int。。
int 字节4 数值范围:-2147483648~+2147483647
long 字节4 数值范围 -2147483648~+2147483647
float 字节4 数值范围 3.4×10^-38~3.4×10^38
double 字节8 数值范围 1.7×10^-308~1.7×10^308
/*h*/
#include <stdio.h>
#include <math.h>
double hanshu(int n,int m);
int main()
{
int n,m;
int i,j,k;
scanf("%d",&n);
for (i=1;i<=n-1;i++)
{
if (i==1)
{
printf("%d ",1);
continue;
}
if (i==n-1)
{
printf("%d",1);
continue;
}
printf("%.0lf ",hanshu(n,i));
}getchar(); getchar();
return 0;
}
double hanshu(int n,int m)
{
int i,j,k;
double n1=1,m1=1;
if (m<n/2+1)
{
n1=1;m1=1;
for (i=0;i<m;i++)
n1*=(n-i);
for (i=1;i<=m;i++)
m1*=i;
return (n1/m1);
}
else
{
return hanshu(n,n-m);
}
}