代码实现
分析:为了好理解,将代码中的空格换为"*"
#include<stdio.h>
#define N 12
long combi(int n,int r)
{
int i;
long p = 1;
for(i=1;i<=r;i++)
{
p = p*(n-i+1)/i;
}
return p;
}
void paint()
{
int n,r;
for(n=0;n<=N;n++)
{
for(r=0;r<=n;r++)
{
int i;
if(0==r)
{
for(i=0;i<=(N-n);i++)
printf(" ");//两个空格
}
else
{
printf(" ");//一个空格
}
printf("%3d",combi(n,r));
}
printf("\n");
}
}
int main()
{
paint();
return 0;
}
combi()函数是用来求每一行输出的值的,首先每行通过一个循环输出最左边
的"*",然后输出combi()返回的一个数,再输出else语句中的一个"*",最后换
行,继续循环。可以看到如果不要左边的"*",每一行数字的个数总比"*"多一,由代码解释就是
可以看到,在这个循环中,每次循环都将r从0开始复制,然后r++,所以每次
循环都会在第一次进入if(0==r)的执行体执行,所以第一次不会进入else输出
一个"*",而printf("%3d",combi(n,r))每次都会执行,并输出一个数字,这样在
屏幕输出的数就比"*"多一个了。另外之所以控制输出位宽为"%3d",是因为这
里N为12,共输出13行,这些数中最大的数为924,所以没有数会超过3位
,
所以这样做是为了对齐,若改为"%2d",结果为
可以看到并没有对齐
而对于函数combi(),大家是否记得排序组合问题,A(4,3)=4*3*2,
A(8,4)=8*7*6*5, C(5,3)=(5!)/(3!*2!), C(8,6)=(8!)/(6!*2!)
而这里正是要用到C(n,r),这就是combi(n,r)的根本算法