方法二:用自定义函数来编写。
首先,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和。杨辉三角的任意一行都是的二项式系数,n为行数减1。也就是说任何一个数等于这个是高中的组合数。n代表行数减1,不代表列数减1。如:第五行的第三个数就为=6。
先定义一个二维数组:a[N][N],略大于要打印的行数。再令两边的数为1,即当每行的第一个数和最后一个数为1。a[i][0]=a[i][i-1]=1,n为行数。除两边的数外,任何一个数为上两顶数之和,即a[i][j]=a[i-1][j-1]+a[i-1][j]。最后输出杨辉三角。
方法一二维数组代码如下:
#include
<stdio.h>#define
N
14void
main(){ int
i,
j,
k,
n=0,
a[N][N]
/*定义二维数组a[14][14]*/ while(n<=0||n>=13){
/*控制打印的行数不要太大,过大会造成显示不规范*/printf("请输入要打印的行数:") scanf("%d",&n) } printf("%d行杨辉三角如下:\n",n) for(i=1i<=ni++)a[i][1]
=
a[i][i]
=
1
/*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/ for(i=3i<=ni++)for(j=2j<=i-1j++) a[i][j]=a[i-1][j-1]+a[i-1][j]
/*除两边的数外都等于上两顶数之和*/ for(i=1i<=ni++){for(k=1k<=n-ik++) printf("
")
/*这一行主要是在输出数之前打上空格占位,让输出的数更美观*/for(j=1j<=ij++)
/*j<=i的原因是不输出其它的数,只输出我们想要的数*/ printf("%6d",a[i][j])printf("\n")
/*当一行输出完以后换行继续下一行的输出*/ } printf("\n")}
方法二:自定义函数代码:
杨辉三角中的任何一个数都等于一个组合数。
#include
<stdio.h>/* *
定义阶乘,在这里可能会想。为什么要用float,当我试第一次的时候, *
如果用int的话,那么在打印行数多了以后就会出错。 *
这是因为阶乘的数比较大,如果用int就不够用了。下同 */float
J(int
i){ int
j float
k=1 for(j=1j<=ij++)k=k*j return(k)}float
C(int
i,int
j){
/*定义组合数*/ float
k k=J(j)/(J(i)*J(j-i)) return(k)}void
main(){ int
i=0,j,k,n
/*打印杨辉三角*/ while(i<=0||i>16){printf("请输入要打印的行数:") scanf("%d",&i) } printf("%d行杨辉三角如下:\n",i) for(j=0j<ij++){for(k=1k<=(i-j)k++) printf("
") for(n=0n<=jn++) printf("%4.0f",C(n,j)) printf("\n") } printf("\n\n")}
标个记号准备上传对大神的源码分析。好了,我分析了上楼大神的代码实现,具体参考他的代码,分享下。注:可以看看《算法精解》Kyle Loudon著 或者《数据结构》 主编 安训国 他们说的堆栈原理。
#include <stdio.h>
char* dg(char* instr, char* outstr, char* outstr2)
{
if (*instr == 0)
{
*outstr = 0
return outstr2
}
*(outstr + 1) = *instr
outstr = dg(instr + 1, outstr + 2, outstr2)
/* 下两句一直不执行,直到outstr = dg(instr + 5, outstr + 10, outstr2)返回后才执行,其后不断执行后三句!*/
*outstr = *instr - 32
return outstr + 2
}
int main()
{
char buf[50]
dg("aybdx", buf, buf)
puts(buf)
return 0
}
以 C 语言为例,举一个最最经典的例子就是:计算一个整数的阶乘。#include <stdio.h>
int my_jiecheng( int ) /* 计算阶乘子函数原型说明 */
int main( )
{
int num, result = 0
scanf("%d", &num) /* 从键盘输入一个整数 num */
result = my_jiecheng(num) /* 调用计算阶乘子函数 my_jeicheng( ),并将最终的结果保存在 result 变量中 */
printf("result = %d\n", result ) /* 输出最后的计算结果 */
return 0
}
int my_jiecheng( n )
{
if( n == 1 ) /* 定义: 1!== 1,即:1 的阶乘等于 1 */
return (1) /* n == 1,返回 1 */
else /* 递归调用 my_jiecheng( ) 子函数 */
return( n * my_jiecheng(n-1) ) /* 否则的话,n != 1,递归调用 n*(n-1) ! */
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)