杨辉三角形是形如:
1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。这个题目常用于程序设计的练习。
下面给出六种不同的解法。
解法一
#include   <stdio.h>
main()
{ int i,j,n=0,a[17][17]={0};
   while(n<1 || n>16)
   { printf("请输入杨辉三角形的行数:");
     scanf("%d",&n);
   }
   for(i=0;i<n;i++)
     a[i][0]=1;      
   for(i=1;i<n;i++)
     for(j=1;j<=i;j++)
       a[i][j]=a[i-1][j-1]+a[i-1][j];
   for(i=0;i<n;i++)   
   { for(j=0;j<=i;j++)
       printf("%5d",a[i][j]);
     printf("\n");
   }
}
点评:解法一是一般最容易想到的解法,各部分功能独立,程序浅显易懂。
解法二
#include   <stdio.h>
main()
{ int i,j,n=0,a[17][17]={1};
   while(n<1 || n>16)
   { printf("请输入杨辉三角形的行数:");
     scanf("%d",&n);
   }
   for(i=1;i<n;i++)
   { a[i][0]=1;             
     for(j=1;j<=i;j++)
       a[i][j]=a[i-1][j-1]+a[i-1][j];  
   }
     for(i=0;i<n;i++)           
     { for(j=0;j<=i;j++)
         printf("%5d",a[i][j]);
       printf("\n");
     }
}
点评:解窢二是在解法一的基础上,把第一列置为1的命令移到下面的双重循环中,减少了一个循环。注意初始化数组的变化。
解法三
#include   <stdio.h>
main()
{ int i,j,n=0,a[17][17]={0,1};
   while(n<1 || n>16)
   { printf("请输入杨辉三角形的行数:");
     scanf("%d",&n);
   }
   for(i=1;i<=n;i++)
   for(j=1;j<=i;j++)
     a[i][j]=a[i-1][j-1]+a[i-1][j];  
   for(i=1;i<=n;i++)          
   { for(j=1;j<=i;j++) printf("%5d",a[i][j]);
      printf("\n");
   }
}
点评:解法三是在解法一、二的基础上,把第一列置为1的命令去掉了,注意初始化数组的变化。
解法四
#include   <stdio.h>
main()
{ int i,j,n=0,a[17][17]={0,1};
   while(n<1 || n>16)
   { printf("请输入杨辉三角形的行数:");
     scanf("%d",&n);
   }
   for(i=1;i<=n;i++)
   { for(j=1;j<=i;j++)
     { a[i][j]=a[i-1][j-1]+a[i-1][j];  
       printf("%5d",a[i][j]);   
     }
     printf("\n");
   }
}
点评:解法四是在解法三的基础上,把计算和打印合并在一个双重循环中。
解法五
#include <stdio.h>
main()
{ int i,j,n=0,a[17]={1},b[17];
   while(n<1 || n>16)
   { printf("请输入杨辉三角形的行数:");
     scanf("%d",&n);
   }
   for(i=0;i<n;i++)
   { b[0]=a[0];
     for(j=1;j<=i;j++)
        b[j]=a[j-1]+a[j];  
     for(j=0;j<=i;j++)           
     { a[j]=b[j];  
       printf("%5d",a[j]);
     }
     printf("\n");
   }
}
点评:解法一到解法四都用了二维数组,占用的空间较多。而解法五只使用了两个一维数组。
解法六
#include   <stdio.h>
main()
{ int i,j,n=0,a[17]={0,1},l,r;
   while(n<1 || n>16)
   { printf("请输入杨辉三角形的行数:");
     scanf("%d",&n);
   }
   for(i=1;i<=n;i++)
   { l=0;
     for(j=1;j<=i;j++)
     { r=a[j];
       a[j]=l+r;  
       l=r;
       printf("%5d",a[j]);  
     }
     printf("\n");
   }
}
点评:解法六只使用了一个一维数组和两个临时变量。

一天一个算法:C语言解答杨辉三角的更多相关文章

  1. C语言打印杨辉三角(2种方法)

    杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一. ...

  2. Leecode刷题之旅-C语言/python-118杨辉三角

    /* * @lc app=leetcode.cn id=118 lang=c * * [118] 杨辉三角 * * https://leetcode-cn.com/problems/pascals-t ...

  3. java语言编写杨辉三角

    package com.llh.demo; /** * 杨辉三角 * * @author llh * */ public class Test { /* * 杨辉三角 */ public static ...

  4. C语言118. 杨辉三角

    给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5输出:[ [1], [1,1], [1,2,1], [1, ...

  5. C语言复习---杨辉三角打印

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math ...

  6. Python之杨辉三角算法实现

    学习了廖雪峰的官方网站的python一些基础,里面有个题目,就是让写出杨辉三角的实现,然后我就花了时间实现了一把.思路也很简单,就是收尾插入0,然后逐层按照杨辉三角的算法去求和实现杨辉三角. 附属代码 ...

  7. 杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析

    说明 本文给出杨辉三角的几种C语言实现,并简要分析典型方法的复杂度. 本文假定读者具备二项式定理.排列组合.求和等方面的数学知识. 一  基本概念 杨辉三角,又称贾宪三角.帕斯卡三角,是二项式系数在三 ...

  8. 杨辉三角(C语言)

    杨辉三角 杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的<详解九章算法>一书中出现.在欧洲,帕斯卡(1623----1662)在1654年发现这一规律, ...

  9. 基于visual Studio2013解决C语言竞赛题之0509杨辉三角

     题目

随机推荐

  1. org/eclipse/jetty/util/component/Container$Listener

    转自:https://blog.csdn.net/husheng8891/article/details/10200965?locationNum=9&fps=1 项目Demo开发的时候,发布 ...

  2. Rep Invariant and Abstraction Function

    * According to the Reading 13 of MIT 6.005 course In order to finish Lab 2, in which the ps 2 gives ...

  3. ubuntu安装之后root用户配置

    安装ubuntu之后发现不切换到root显示:su: Authentication failure   需要进行一下操作   表示成功切换到root用户

  4. GCD的小结

    同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行 有4个术语比较容易混淆:同步.异步.并发.串行 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能 ...

  5. Comparable与Comparator区别(实现和使用)

    一.Comparable接口 1.Comparable接口是什么? 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 . ...

  6. 编译安装FFmpeg 要支持xvid、x264、mp3、ogg、amr、faac

    编译安装FFmpeg 要支持xvid.x264.mp3.ogg.amr.faac libfaac    faac格式的编解码包libmp3lame    mp3格式编解码包libopencore-am ...

  7. sql获得某个时间段的数据

    CONVERT(Date, 时间字符串变量 ) between CONVERT(Date,'2015/2/10') and CONVERT(Date,'2015-3-10')

  8. 使用最新vue_cli搭建的模版

    使用最新vue_cli搭建的模版,包含了常用的插件,router和axiox与测试插件.项目的结构如下: 使用之前请打开 REAMME.md 看看. 已经搭建好的框架的下载地址:https://sha ...

  9. DB2报“数据库日志已满”问题解决

    用控制中心直接改会比较容易一点,在数据库名称上点右键-->配置-->日志-->日志文件大小.主日志文件数.辅助日志文件数改大一点. 也可用命令行db2cmd db2 update d ...

  10. 01《UML大战需求分析》阅读笔记之一

    在大二的时候就已经在课堂上对UML也就是统一建模语言有了初步的了解,但是却不怎么明白,虽然可以画图可以完成任务,但是有些糊里糊涂.所以特地把这门书作为精读书籍,想要更加深度地学习UML.很多内容只用语 ...