其实就是数学的排列组合的问题。对排列组合求和。
我就不列出是怎样的排列了,就列出有几类排列组合,还有结果。
#include
#include
inline long A(int a1,int a2)
{
int r=1;
for(int i=0;ir*=a1--;
return r;
}
inline long C(int c1,int c2)
{
double r=1;
int nc2=c2;
for(int i=0;i{
r*=c1--;
if(nc2>0)r/=nc2--;
}
return (long)r;
}
int main()
{
int n;
long sum=0;//阶级数,结果
int max2;//最大2步数
int nums1,nums2;//1的个数,2的个数
int i;
printf("stairs: 0scanf("%d",&n);
if(n%2==0)
max2=n/2;
else
max2=(n-1)/2;
printf("max step2:%d\n",max2);
for(i=0;i<=max2;i++)
{
int temp;
nums2=i;
nums1=n-nums2*2;
printf("step1:%d,step2:%d\n",nums1,nums2);
temp=C(nums1+nums2,nums2);//;sum+=C(nums1+nums2,nums1);
printf("ways:%d\n",temp);
sum+=temp;
}
printf("final ways:%d\n",sum);
return 0;
}
用递归,第n阶的走法是n-1阶和n-2阶的和,而第一阶有1种走法,第二阶有2种走法,第三阶走3种走法,递归