题目:
妞妞喜欢图形,总是喜欢把图形倒过来欣赏。有一次,她看见杨辉三角形,觉得很新鲜,于是就把它们大大小小地摆列出来了,好不得意哦。
输入格式:
输入数据中包含了多个整数n(1≤n≤10),以键盘输入结束^Z和遇文件结束符时结束输入。
输出格式:
以n为行数,其打印出的倒杨辉三角形(每个数据占三个字符)就是妞妞所喜欢的。每个倒三角形之间没有空行,见样本输出。
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
看到这里,估计专业人士第一个想到的就是用递归,但是递归是一个较难的知识点,很令人头大,那么能不能用非递归的办法完成呢?当然有的 。
分析:
我们在高中都学过杨辉三角的内容,杨辉三角是什么呢?具体如下
常用的性质有:
-
每个数等于它上方两数之和。
-
每行数字左右对称,由1开始逐渐变大。
-
第n行的数字有n项。
-
第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
-
第n行的第m个数和第n-m+1个数相等 ,为组合数性质之一。
-
每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。
那么我们就利用以上这六点性质就可以实现解题
1.首先,需要嵌套循环来做,第一个变量i控制行数
2.第二个变量j控制每行最开始的空格数
3.除了最后一行只有一个1,其他行都有两个1,那么我们可以用i和n的关系来处理特殊情况
4.两个1中间的内容就是组合数,第三个变量k控制每行两个1中间的数的大小
例如输入5的倒三角第1行 1 4=C(4,1) 6=C(4,2) 4=C(4,3) 1
再看2行找到规律 1 3=C(3,1) 3=C(3,2) 1
相信看到这里大多数有人都有答案了,但是如果没看懂的话再写一行
第3行 1 2=C(2,1) 1
由此可以得到每一行两个1中对应的数与行数和输入的n有关
第1行可以看成 1 C(n-i,1) C(n-i,2) C(n-i,3) 1 k=1,k<=n-i-1=3
第2行可以看成 1 C(n-i,1) C(n-i,2) 1 k=1,k<=n-i-1=2
........
看懂了杨辉三角的构成后我们还要知道的是求组合数的函数,组合数怎么求呢?
由此我们可以得到函数主体:
double fact(int b)
{
int a = 0;
double fact = 1;
for (a = 1; a <= b; a++) //计算阶乘的函数
{
fact *= a;
}
return fact;
}
主函数采用 fact(n-i) / (fact(k) * fact(n-i-k))计算就可以求出相应的数值
那么就可以借此写主函数:
#include <stdio.h>
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++) //控制行
{
for(int j=1;j<=3*i-1;j++) //控制每行的空格数
{
printf(" ");
}
printf("1"); //输出每行第一个1
for(int k=1;k<=n-1-i;k++) //求每行两个1中间的数值
{
printf("%6.0f",fact(n-i) / (fact(k) * fact(n-i-k))); //组合数
}
if(i!=n) //利用i和n的关系判断是否输出第二个1
printf(" 1");
printf("\n"); //一行内容输出结束后换行
}
}
return 0;
}
整合后的代码为:
#include<stdio.h>
double fact(int b);
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++) //控制行
{
for(int j=1;j<=3*i-1;j++) //控制每行的空格数
{
printf(" ");
}
printf("1"); //输出每行第一个1
for(int k=1;k<=n-1-i;k++) //求每行两个1中间的数值
{
printf("%6.0f",fact(n-i) / (fact(k) * fact(n-i-k))); //组合数
}
if(i!=n) //利用i和n的关系判断是否输出第二个1
printf(" 1");
printf("\n");
}
}
return 0;
}
double fact(int b)
{
int a = 0;
double fact = 1;
for (a = 1; a <= b; a++) //求阶乘
{
fact *= a;
}
return fact;
}
打印结果:
这就是倒杨辉三角的做法啦,有什么不妥还望指点~~