每日练习(3-29.1)

一、 输出杨辉三角

(声明下,有些代码是学习了别人的代码,然后我用自己的思维去详述,对于小白还是比较有用的)

1.先就题论题吧。就说咋打印出这个东西。先从简单的来。

    1
    1    1
    1    2    1
    1    3    3    1
    1    4    6    4    1
    1    5   10   10    5    1
    1    6   15   20   15    6    1
    1    7   21   35   35   21    7    1
    1    8   28   56   70   56   28    8    1
    1    9   36   84  126  126   84   36    9    1

乍一看,每行的第一个元素是1,最后一个也是1。

从第二行开始,看到第二行的第一个(a21)和第二个(a22)加起来是第三行(a32)的值,1+1=2

第三行中,a31+a32=1+2=a42=3,  a32+a33=2+1=a43=3,

所以得出

a[i][j]=a[i-1][j-1]+a[i-1][j];//由上一行得到下一行的,满足杨辉三角,a[i-1][j]是a[i][j]的同列上一行一个数,a[i-1][j-1]是a[i-1][j];的前一个数。

因为每行第一个元素为1,所以每次循环将它赋值为1

每行末尾的元素也为1,所以每次循环将[i][i]赋值为1

通过二维数组数组来存储每个元素,通过for循环来控制行数,直到完成二维数组的赋值

最后输出数组

#include <stdio.h>

#define N 10  //宏定义,表示N为10

void main()
{

	int a[N][N],i,j;//整型数组a[N][N],变量i,j

	for(i=0;i<N;i++)//循环,初始化i,当i<N时,执行循环,每次循环i++

	{

      a[i][0]=1;  //每次循环,都相当于把数组的第一列的第一个数赋值为1
	
	  a[i][i]=1;  //数组对角线上的多为1
	
	  for(j=1;j<i;j++)//循环,用以输出除了对角线,以及第一列的其他数
	
	   a[i][j]=a[i-1][j-1]+a[i-1][j];//由上一行得到下一行的,满足杨辉三角,a[i-1][j]是a[i][j]的同列上一行一个数,a[i-1][j-1]是a[i-1][j];的前一个数。

	}

	printf("杨辉三角的前%d行为:\n",N);
	for(i=0;i<N;i++)//输出数组,即杨辉三角

	{

	    for(j=0;j<=i;j++)

		printf("%5d",a[i][j]);
		printf("\n");

	}

}

运行结果:

杨辉三角的前10行为:
    1
    1    1
    1    2    1
    1    3    3    1
    1    4    6    4    1
    1    5   10   10    5    1
    1    6   15   20   15    6    1
    1    7   21   35   35   21    7    1
    1    8   28   56   70   56   28    8    1
    1    9   36   84  126  126   84   36    9    1

--------------------------------

2.上面这个还不算真正的杨辉三角。先来扯一段。

先从2次多项式来说,(a+b)^2

\left ( a+b \right )^{^{2}}=a^{2}+2*a*b+b^{2}

它的未知数的系数为 1,2,1

再来看看,\left ( a+b \right )^{3}=a^{3}+3*a^{2}*b+3*a*b^{2}+b^{3}

它的系数为1,3,3,1

再来看看\left ( a+b \right )^{4}=a^{4}+4*a^{3}*b+6*a^{2}*b^{2}+4*a*b^{3}+b^{4}

它的系数为1,4,6,4,1

暂时得到  1 2 1

               1 3 3 1

              1 4 6 4 1

最终可以从这个推广得到二项式定理的公式。它俩算数形结合吧。

然后来搞这个杨辉三角。

依然有每行的第一项和最后一项是1,先把这种存入数组。

然后通过公式存入有规律的项

注意到每行前面有空格,在打印二维数组时,

第一行有4个空,第二行有3个空,第三行有2个空

第4行有1个空,第5行有0个空

所以得到     j = n - i - 1; j > 0; j--

 

二、约瑟夫生者死者小游戏

30 个人在一条船上,超载,需要 15 人下船。

于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。

如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

#include<stdio.h>

int main(){
    int count=0,//记录下船的人数 ,到15就终止程序 
    a[30]={0},//储存30人信息,0代表在船上,1代表下船了 
    i=0,//循环索引 
    c=0;// 记录报数号码,到9就清零,由下一位重新报数 
    while(1) { 
        if(a[i]==0)c++;//记录报数号码
        if(c==9){
            count++;//下船人数加一 
            a[i]=1; //标记这个人下船了
            printf("第%d号下船了。\n",i+1);
            c=0;//到9就清零,由下一位从0重新报数 
        }
        if(count==15)break;//下船的人数到15就终止程序 
        i++;//分析下一个人 
        if(i==30)i=0; //将数组变成一个圈,循环往复 
    }
    return 0; 
}

第9号下船了。
第18号下船了。
第27号下船了。
第6号下船了。
第16号下船了。
第26号下船了。
第7号下船了。
第19号下船了。
第30号下船了。
第12号下船了。
第24号下船了。
第8号下船了。
第22号下船了。
第5号下船了。
第23号下船了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值