c程序— 巴斯卡三角形

合集下载

C语言中各种三角形程序详解

C语言中各种三角形程序详解

1.package com.xyq.demo;2.public class Triangle {3.4./**5.* @param args6.*/7.8.public static void main(String[] args) {9.a(); //打印正等腰三角10. b(); //打印倒等腰三角11. c(); //打印直边靠左正直角三角12. d(); //打印直边靠右正直角三角13. e(); //打印直边靠左倒直角三角14. f(); //打印直边靠右倒直角三角15. g(); //打印底边靠左钝角角三角16. h(); //打印底边靠右钝角角三角17. }18. /**19.* 作用:打印正等腰三角20.*/21. public static void a(){22. System.out.println("打印正等腰三角");23. int i ,j;24. for(i=1;i<=5;i++){25. for(j=5;j>i;j--){26. System.out.print(" ");27. }28. for(j=0;j<i*2-1;j++){29. System.out.print("*");30. }31. System.out.println();32. }33. }34.35. /**36.* 打印倒等腰三角37.*/38. public static void b(){39. System.out.println("打印倒等腰三角");40. int i ,j ;41. for(i=1;i<=5;i++){42. for(j=1;j<i;j++){43. System.out.print(" ");44. }45. for(j=10;j>i*2-1;j--){46. System.out.print("*");47. }48. System.out.println();49. }50. }51. /**52.* 打印直边靠左正直角三角53.*/54. public static void c(){55. System.out.println("打印直边靠左正直角三角");56. int i ,j ;57. for(i=1;i<=5;i++){58. for(j=0;j<i;j++){59. System.out.print("*");60. }61. System.out.println();62. }63. }64.65. /**66.* 打印直边靠右正直角三角67.*/68. public static void d(){69. System.out.println("打印直边靠右正直角三角");70. int i ,j;71. for(i=1;i<=5;i++){72. for(j=5;j>i;j--){73. System.out.print(" ");74. }75. for(j=0;j<i;j++){76. System.out.print("*");77. }78. System.out.println();79. }80. }81. /**82.* 打印直边靠左倒直角三角83.*/84. public static void e(){85. System.out.println("打印直边靠左倒直角三角");86. int i ,j;87. for(i=1;i<=5;i++){88. for(j=5;j>=i;j--){89. System.out.print("*");90. }91. System.out.println();92. }93. }94. /**95.* 打印直边靠右倒直角三角96.*/97. public static void f(){98. System.out.println("打印直边靠右倒直角三角");99. int i ,j;100.for(i=1;i<=5;i++){101.for(j=1;j<i;j++){102.System.out.print(" ");103.}104.for(j=5;j>=i;j--){105.System.out.print("*");106.}107.System.out.println();108.}109.}110./**111.* 打印底边靠左钝角角三角112.*/113.public static void g(){114.System.out.println("打印底边靠左钝角角三角");115.int i ,j ;116.for(i=1;i<=5;i++){117.for(j=0;j<i;j++){118.System.out.print("*");119.}120.System.out.println();121.}122.for(i=1;i<5;i++){123.for(j=5;j>i;j--){124.System.out.print("*");125.}126.System.out.println();127.}128.}129./**130.* 打印底边靠右钝角角三角131.*/132.public static void h(){133.System.out.print("打印底边靠右钝角角三角");134.int i,j;135.for(i=0;i<=5;i++){136.for(j=5;j>i;j--){137.System.out.print(" ");138.}139.for(j=0;j<i;j++){140.System.out.print("*");141.}142.System.out.println();143.}144.for(i=1;i<5;i++){145.for(j=0;j<i;j++){146.System.out.print(" ");147.}148.for(j=5;j>i;j--){149.System.out.print("*");150.}151.System.out.println();152.}153.}154.}逆序的各种算法:1.public class Reverse {2.public static void main(String[] args) {3.//定义的字符4.String s = "华中爱我";5.6.7.//通过String的subString方法8.int len = s.length();9.String sub_reverse = "";10. for (int i = len; i > 0; i--)11. sub_reverse += s.substring(i - 1,i); //返回子字符串,开始于i-1结束于i12. System.out.println("通过substring方法逆序: "+sub_reverse);13.14.15.//通过Sring的StringBuffer方法逆序16. String buffer_reverse;17. buffer_reverse=(new StringBuffer(s).reverse()).toString();18. System.out.println("通过StringBuffer方法逆序: "+buffer_reverse);19.20.21.//通过数组实现字符串逆序22. char[] c = s.toCharArray();23. char[] temp = new char[c.length];24. for (int i = 0, j = c.length - 1; i< c.length; i++, j--) {25. temp[j] = c[i];26. }27. System.out.println("通过数组来逆序: "+buffer_reverse);28.29.30.31.32. }33.}c用for循环打印三角形直角空心直角,等腰,等腰空心c用for循环打印三角形,直角,空心直角,等腰,等腰空心34.直角三角形 t11.c35.#include36.main()37.{38. int i,j;39. for (i=1;i<=10;i++) {40. for (j=1;j<=i;j++) {41. printf("*");42. }43. printf("\n");44. }45.}46.47.直角空心三角形 t12.c48.#include49.main()50.{51. int i,j;52. for (i=1;i<=10;i++) {53. for (j=1;j<=i;j++) {54. if (j==1 || j==i|| i==10)55.printf("*");56. else57.printf(" ");58. }59. printf("\n");60. }61.}62.等腰三角形 t13.c63.#include64.main()65.{66. int i,j;67. for (i=1;i<=10;i++) {68. for (j=1;j<=10-i;j++)69. printf(" ");70. for (j=1;j<=2*i-1;j++)71. printf("*");72. printf("\n");73. }74.}75.等腰空心三角形 t14.c76.#include77.main()78.{79. int i,j;80. for (i=1;i<=10;i++) {81. for (j=1;j<=10-i;j++)82. printf(" ");83. for (j=1;j<=2*i-1;j++) {84. if (j==1 ||j==2*i-1 || i==10)85.printf("*");86. else87.printf(" ");88. }89. printf("\n");90. }91.}。

C语言经典算法大全(可编辑)

C语言经典算法大全(可编辑)

C语言经典算法大全C语言经典算法大全老掉牙河内塔费式数列巴斯卡三角形三色棋老鼠走迷官一老鼠走迷官二骑士走棋盘八个皇后八枚银币生命游戏字串核对双色三色河内塔背包问题Knapsack Problem数运算蒙地卡罗法求 PIEratosthenes筛选求质数超长整数运算大数运算长 PI最大公因数最小公倍数因式分解完美数阿姆斯壮数最大访客数中序式转后序式前序式后序式的运算关于赌博洗扑克牌乱数排列Craps赌博游戏约瑟夫问题Josephus Problem 集合问题排列组合格雷码Gray Code产生可能的集合m元素集合的n个元素子集数字拆解排序得分排行选择插入气泡排序Shell 排序法 - 改良的插入排序Shaker 排序法 - 改良的气泡排序Heap 排序法 - 改良的选择排序快速排序法一快速排序法二快速排序法三合并排序法基数排序法搜寻循序搜寻法使用卫兵二分搜寻法搜寻原则的代表插补搜寻法费氏搜寻法矩阵稀疏矩阵多维矩阵转一维矩阵上三角下三角对称矩阵奇数魔方阵4N 魔方阵2 2N1 魔方阵 1河内之塔说明河内之塔 Towers of Hanoi 是法国人MClaus Lucas 于1883年从泰国带至法国的河内为越战时北越的首都即现在的胡志明市1883年法国数学家 Edouard Lucas曾提及这个故事据说创世纪时Benares有一座波罗教塔是由三支钻石棒Pag所支撑开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘Disc并命令僧侣将所有的金盘从第一根石棒移至第三根石棒且搬运过程中遵守大盘子在小盘子之下的原则若每日仅搬一个盘子则当盘子全数搬运完毕之时此塔将毁损而也就是世界末日来临之时解法如果柱子标为ABC要由A搬至C在只有一个盘子时就将它直接搬至C当有两个盘子就将B当作辅助柱如果盘数超过2个将第三个以下的盘子遮起来就很简单了每次处理两个盘子也就是A- BA - CB- C这三个步骤而被遮住的部份其实就是进入程式的递回处理事实上若有n个盘子则移动完毕所需之次数为2n - 1所以当盘数为64时则所需次数为264- 1 1XXXXXXXXXX709551615为505390248594782e16年也就是约5000世纪如果对这数字没什幺概念就假设每秒钟搬一个盘子好了也要约5850亿年左右includevoid hanoi int n char A char B char Cif n 1printf "Move sheet d from c to c\n" n A Celsehanoi n-1 A C Bprintf "Move sheet d from c to c\n" n A Chanoi n-1 B A Cint mainint nprintf "请输入盘数"scanf "d" nhanoi n A B Cfn fn-1 fn-2 if n 1fn n if n 0 1includeinclude define N 20 int main voidint Fib[N] 0int i Fib[0] 0Fib[1] 1 for i 2 i N iFib[i] Fib[i-1] Fib[i-2] for i 0 i N i printf "d " Fib[i]printf "\n"return 03 巴斯卡三角形 includedefine N 12long combi int n int rint ilong p 1for i 1 i r ip p n-i1 ireturn pvoid mainint n r tfor n 0 n N nfor r 0 r n rint i 排版设定开始if r 0for i 0 i N-n i printf " "elseprintf " "排版设定结束printf "3d" combi n rprintf "\n"4Algorithm Gossip 三色棋说明三色旗的问题最早由EWDijkstra所提出Dutch Nation Flag Dijkstra为荷兰人 Three-Color Flag来称之假设有一条绳子上面有红白蓝三种颜色的旗子起初绳子上的旗子颜色并没有顺序您希望将之分类并排列为蓝白红的顺序要如何移动次数才会最少注意您只能在绳子上进行这个动作而且一次只能调换两个旗子解法在一条绳子上移动在程式中也就意味只能使用一个阵列而不使用其它的阵列来作辅助问题的解法很简单您可以自己想像一下在移动旗子从绳子开头进行遇到蓝色往前移遇到白色留在中间遇到红色往后移如下所示只是要让移动次数最少的话就要有些技巧如果图中W所在的位置为白色则W1表示未处理的部份移至至白色群组如果W部份为蓝色则B与W的元素对调而B与W必须各1表示两个群组都多了一个元素如果W所在的位置是红色则将W与R交换但R要减1表示未处理的部份减1 注意BWR并不是三色旗的个数它们只是一个移动的指标什幺时候移动结束呢一开始时未处理的R指标会是等于旗子的总数当R的索引数减至少于W的索引数时表示接下来的旗子就都是红色了此时就可以结束移动如下所示 includeincludeinclude define BLUE bdefine WHITE wdefine RED r define SWAP x y char temp \temp color[x] \color[x] color[y] \color[y] temp int main char color[] r w b w wb r b w r \0 int wFlag 0 int bFlag 0int rFlag strlen color - 1int i for i 0 i strlen color iprintf "c " color[i]printf "\n" while wFlag rFlagif color[wFlag] WHITEwFlagelse if color[wFlag] BLUESWAP bFlag wFlagbFlag wFlagelsewhile wFlag rFlag color[rFlag] REDrFlag--SWAP rFlag wFlagrFlag--for i 0 i strlen color i printf "c " color[i]printf "\n" return 05Algorithm Gossip 老鼠走迷官说明老鼠走迷宫是递回求解的基本题型我们在二维阵列中使用2表示迷宫墙壁使用1来表示老鼠的行走路径试以程式求出由入口至出口的路径解法老鼠的走法有上左下右四个方向在每前进一格之后就选一个方向前进无法前进时退回选择下一个可前进方向如此在阵列中依序测试四个方向直到走到出口为止这是递回的基本题请直接看程式应就可以理解includeinclude int visit int int int maze[7][7] 2 2 2 22 2 22 0 0 0 0 0 22 0 2 0 2 0 22 0 0 2 0 2 22 2 0 2 0 2 22 0 0 0 0 0 22 2 2 2 2 2 2 int startI 1 startJ 1 入口int endI 5 endJ 5 出口int success 0 int main voidint i j printf "显示迷宫\n"for i 0 i 7 ifor j 0 j 7 jif maze[i][j] 2printf "█"elseprintf " "printf "\n"if visit startI startJ 0 printf "\n没有找到出口\n"elseprintf "\n\n"for i 0 i 7 ifor j 0 j 7 jif maze[i][j] 2printf "█"else if maze[i][j] 1 printf "◇"elseprintf " "printf "\n"return 0int visit int i int jmaze[i][j] 1 if i endI j endJsuccess 1 if success 1 maze[i][j1]0 visit i j1if success 1 maze[i1][j] 0 visit i1 jif success 1 maze[i][j-1] 0 visit i j-1if success 1 maze[i-1][j] 0 visit i-1 j if success 1maze[i][j] 0 return success6Algorithm Gossip 老鼠走迷官说明由于迷宫的设计老鼠走迷宫的入口至出口路径可能不只一条如何求出所有的路径呢解法求所有路径看起来复杂但其实更简单只要在老鼠走至出口时显示经过的路径然后退回上一格重新选择下一个位置继续递回就可以了比求出单一路径还简单我们的程式只要作一点修改就可以了includeinclude void visit int int int maze[9][9] 2 2 2 22 2 2 2 22 0 0 0 0 0 0 0 22 0 2 2 0 2 2 0 22 0 2 0 0 2 0 0 22 0 2 0 2 0 2 0 22 0 0 0 0 0 2 0 22 2 0 2 2 0 2 2 22 0 0 0 0 0 0 0 22 2 2 2 2 2 2 2 2 int startI 1 startJ 1 入口int endI 7 endJ 7 出口 int main voidint i j printf "显示迷宫\n"for i 0 i 7 ifor j 0 j 7 jif maze[i][j] 2printf "█"elseprintf " "printf "\n"visit startI startJ return 0void visit int i int jint m n maze[i][j] 1 if i endI j endJprintf "\n显示路径\n"for m 0 m 9 mfor n 0 n 9 nif maze[m][n] 2printf "█"else if maze[m][n] 1printf "◇"elseprintf " "printf "\n"if maze[i][j1] 0 visit i j1if maze[i1][j] 0 visit i1 jif maze[i][j-1] 0 visit i j-1if maze[i-1][j] 0 visit i-1 j maze[i][j] 07Algorithm Gossip 骑士走棋盘说明骑士旅游Knight tour[所有的位置include int board[8][8] 0 int main voidint startx startyint i jprintf "输入起始点"scanf "d d" startx starty if travel startx starty printf "\n"elseprintf "\n"for i 0 i 8 ifor j 0 j 8 jprintf "2d " board[i][j]putchar \nreturn 0int travel int x int yint ktmove1[8] -2 -1 1 2 2 1 -1 -2int ktmove2[8] 1 2 2 1 -1 -2 -2 -1 测试下一步的出路int nexti[8] 0int nextj[8] 0记录出路的个数int exists[8] 0int i j k m lint tmpi tmpjint count min tmp i xj yboard[i][j] 1 for m 2 m 64 mfor l 0 l 8 lexists[l] 0 l 0 试探八个方向for k 0 k 8 ktmpi i ktmove1[k]tmpj j ktmove2[k] 如果是边界了if tmpi 0 tmpj 0 tmpi 7 tmpj 7 continue 如果这个方向可走 if board[tmpi][tmpj] 0nexti[l] tmpinextj[l] tmpj可走的方向加一个lcount l如果可走的方向为0个if count 0return 0else if count 1只有一个可走的方向所以直接是最少出路的方向min 0else找出下一个位置的出路数for l 0 l count lfor k 0 k 8 ktmpi nexti[l] ktmove1[k] tmpj nextj[l] ktmove2[k] if tmpi 0 tmpj 0tmpi 7 tmpj 7continueif board[tmpi][tmpj] 0 exists[l]tmp exists[0]min 0从可走的方向中寻找最少出路的方向 for l 1 l count lif exists[l] tmptmp exists[l]min l走最少出路的方向i nexti[min]j nextj[min]board[i][j] mreturn 18Algorithm Gossip 八皇后说明西洋棋中的皇后可以直线前进吃掉遇到的所有棋子如果棋盘上有八个皇后则这八个皇后如何相安无事的放置在棋盘上1970年与1971年 EWDijkstra与NWirth曾经用这个问题来讲解程式设计之技巧解法关于棋盘的问题都可以用递回求解然而如何减少递回的次数在八个皇后的问题中不必要所有的格子都检查过例如若某列检查过该该列的其它格子就不用再检查了这个方法称为分支修剪includeincludedefine N 8 int column[N1] 同栏是否有皇后1int rup[2N1] 右上至左下是否有皇后int lup[2N1] 左上至右下是否有皇后int queen[N1] 0int num 解答编号 void backtrack int 递回求解 intmain voidint inum 0 for i 1 i N icolumn[i] 1 for i 1 i 2N irup[i] lup[i] 1 backtrack 1 return 0void showAnswerint x yprintf "\n解答 d\n" numfor y 1 y N yfor x 1 x N xif queen[y] xprintf " Q"elseprintf " "printf "\n"void backtrack int iint j if i NshowAnswerelsefor j 1 j N jif column[j] 1rup[ij] 1 lup[i-jN] 1 queen[i] j设定为占用column[j] rup[ij] lup[i-jN] 0 backtrack i1column[j] rup[ij] lup[i-jN] 19Algorithm Gossip 八枚银币说明现有八枚银币a b c d e f g h已知其中一枚是假币其重量不同于真币但不知是较轻或较重如何使用天平以最少的比较次数决定出哪枚是假币并得知假币比真币较轻或较重解法单就求假币的问题是不难但问题限制使用最少的比较次数所以我们不能以单纯的回圈比较来求解我们可以使用决策树decision tree使用分析与树状图来协助求解一个简单的状况是这样的我们比较abc与def 如果相等则假币必是g或h我们先比较g或h哪个较重如果g较重再与a比较a是真币如果g等于a则g为真币则h为假币由于h比g轻而 g是真币则h假币的重量比真币轻 include includeinclude void compare int[] int int intvoid eightcoins int[] int main voidint coins[8] 0int i srand time NULL for i 0 i 8 icoins[i] 10 printf "\n输入假币重量比10大或小 "scanf "d" icoins[rand 8] i eightcoins coins printf "\n\n"for i 0 i 8 iprintf "d " coins[i] printf "\n"return 0void compare int coins[] int i int j int kif coins[i] coins[k]printf "\n d 较重" i1elseprintf "\n假币 d 较轻" j1void eightcoins int coins[]if coins[0]coins[1]coins[2]coins[3]coins[4]coins[5]if coins[6] coins[7]compare coins 6 7 0elsecompare coins 7 6 0else if coins[0]coins[1]coins[2]coins[3]coins[4]coins[5]if coins[0]coins[3] coins[1]coins[4]compare coins 2 5 0else if coins[0]coins[3] coins[1]coins[4] compare coins 0 4 1if coins[0]coins[3] coins[1]coins[4]compare coins 1 3 0else if coins[0]coins[1]coins[2]coins[3]coins[4]coins[5]if coins[0]coins[3] coins[1]coins[4]compare coins 5 2 0else if coins[0]coins[3] coins[1]coins[4] compare coins 3 1 0if coins[0]coins[3] coins[1]coins[4]compare coins 4 0 110Algorithm Gossip 生命游戏说明生命游戏game of life1970年由英国数学家J H Conway所提出includeincludeinclude define ROW 10define COL 25define DEAD 0define ALIVE 1int map[ROW][COL] newmap[ROW][COL] void initint neighbors int intvoid outputMapvoid copyMap int mainint row colchar ansinitwhile 1outputMapfor row 0 row ROW rowfor col 0 col COL colswitch neighbors row colcase 0case 1case 4case 5case 6case 7case 8newmap[row][col] DEADbreakcase 2newmap[row][col] map[row][col] breakcase 3newmap[row][col] ALIVEbreakcopyMapprintf "\nContinue next Generation "getcharans toupper getcharif ans Y breakreturn 0void initint row col for row 0 row ROW rowfor col 0 col COL colmap[row][col] DEAD puts "Game of life Program"puts "Enter x y where x y is living cell"printf "0 x d 0 y d\n"ROW-1 COL-1puts "Terminate with x y -1 -1" while 1scanf "d d" row colif 0 row row ROW0 col col COLmap[row][col] ALIVEelse if row -1 col -1breakelseprintf " x y exceeds map ranage"int neighbors int row int colint count 0 c rfor r row-1 r row1 rfor c col-1 c col1 cif r 0 r ROW c 0 c COL continueif map[r][c] ALIVEcountif map[row][col] ALIVEcount--return countvoid outputMapint row colprintf "\n\n20cGame of life cell status\n" for row 0 row ROW rowprintf "\n20c"for col 0 col COL colif map[row][col] ALIVE putchar else putchar -void copyMapint row colfor row 0 row ROW rowfor col 0 col COL colmap[row][col] newmap[row][col]11Algorithm Gossip 字串核对说明今日的一些高阶程式语言对于字串的处理支援越来越强大例如JavaPerl等不过字串搜寻本身仍是个值得探讨的课题在这边以Boyer- Moore法来说明如何进行字串说明这个方法快且原理简洁易懂解法字串搜寻本身不难使用暴力法也可以求解但如何快速搜寻字串就不简单了传统的字串搜寻是从关键字与字串的开头开始比对例如 Knuth-Morris-Pratt 演算法字串搜寻这个方法也不错不过要花时间在公式计算上Boyer-Moore字串核对改由关键字的后面开始核对字串并制作前进表如果比对不符合则依前进表中的值前进至下一个核对处假设是p好了然后比对字串中p-n1至p的值是否与关键字相同如果关键字中有重复出现的字元则前进值就会有两个以上的值此时则取前进值较小的值如此就不会跳过可能的位置例如texture 这个关键字t的前进值应该取后面的3而不是取前面的7 includeincludeinclude void table char 建立前进表int search int char char 搜寻关键字void substring char char int int 取出子字串int skip[256] int main voidchar str_input[80]char str_key[80]char tmp[80] \0int m n pprintf "请输入字串"gets str_inputprintf ""gets str_keym strlen str_inputn strlen str_keytable str_keyp search n-1 str_input str_key while p -1 substring str_input tmp p mprintf "s\n" tmpp search pn1 str_input str_keyprintf "\n"return 0void table char keyint k nn strlen keyfor k 0 k 255 kskip[k] nfor k 0 k n - 1 kskip[key[k]] n - k - 1int search int p char input char keyint i m nchar tmp[80] \0m strlen inputn strlen key while p msubstring input tmp p-n1 pif strcmp tmp key 比较两字串是否相同return p-n1p skip[input[p]]return -1void substring char text char tmp int s int e int i jfor i s j 0 i e i jmp[j] text[i]tmp[j] \012Algorithm Gossip 双色三色河内塔说明双色河内塔与三色河内塔是由之前所介绍过的河内塔规则衍生而来双色河内塔的目的是将下图左上的圆环位置经移动成为右下的圆环位置而三色河内塔则是将下图左上的圆环经移动成为右上的圆环解法无论是双色河内塔或是三色河内塔其解法观念与之前介绍过的河内塔是类似的同样也是使用递回来解不过这次递回解法的目的不同我们先来看只有两个盘的情况这很简单只要将第一柱的黄色移动至第二柱而接下来第一柱的蓝色移动至第三柱再来是四个盘的情况首先必须用递回完成下图左上至右下的移动接下来最底层的就不用管它们了因为它们已经就定位只要再处理第一柱的上面两个盘子就可以了那么六个盘的情况呢一样首先必须用递回完成下图左上至右下的移动接下来最底层的就不用管它们了因为它们已经就定位只要再处理第一柱上面的四个盘子就可以了这又与之前只有四盘的情况相同接下来您就知道该如何进行解题了无论是八个盘十个盘以上等都是用这个观念来解题那么三色河内塔呢一样直接来看九个盘的情况首先必须完成下图的移动结果接下来最底两层的就不用管它们了因为它们已经就定位只要再处理第一柱上面的三个盘子就可以了双色河内塔 C 实作include void hanoi int disks char source char temp char targetif disks 1printf "move disk from c to c\n" source targetprintf "move disk from c to c\n" source target elsehanoi disks-1 source target temphanoi 1 source temp targethanoi disks-1 temp source targetvoid hanoi2colors int diskschar source Achar temp Bchar target Cint ifor i disks 2 i 1 i--hanoi i-1 source temp targetprintf "move disk from c to c\n" source temp printf "move disk from c to c\n" source temp hanoi i-1 target temp sourceprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source targetint mainint nprintf "请输入盘数"scanf "d" n hanoi2colors n return 0C 实作include void hanoi int disks char source char temp char targetif disks 1printf "move disk from c to c\n" source target printf "move disk from c to c\n" source target printf "move disk from c to c\n" source target elsehanoi disks-1 source target temphanoi 1 source temp targethanoi disks-1 temp source targetvoid hanoi3colors int diskschar source Achar temp Bchar target Cint iif disks 3printf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source targetprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" temp sourceprintf "move disk from c to c\n" target tempelsehanoi disks3-1 source temp targetprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source temp hanoi disks3-1 target temp sourceprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" temp target hanoi disks3-1 source target tempprintf "move disk from c to c\n" target sourceprintf "move disk from c to c\n" target source hanoi disks3-1 temp source targetprintf "move disk from c to c\n" source temp for i disks 3 - 1 i 0 i--if i 1hanoi i-1 target source tempprintf "move disk from c to c\n"target source printf "move disk from c to c\n"target source if i 1hanoi i-1 temp source targetprintf "move disk from c to c\n" source tempint mainint nprintf "请输入盘数"scanf "d" n hanoi3colors nreturn 013Algorithm Gossip 背包问题Knapsack Problem说明假设有一个背包的负重最多可达8公斤而希望在背包中装入负重范围内可得之总价物品假设是水果好了水果的编号单价与重量如下所示0 李子 4KG NT4500 1 苹果 5KG NT57002 橘子 2KG NT22503 草莓 1KG NT1100 4甜瓜 6KG NT6700解法背包问题是关于最佳化的问题要解最佳化问题可以使用「动态规划」Dynamic programming从空集合开始每增加一个元素就先求出该阶段的最佳解直到所有的元素加入至集合中最后得到的就是最佳解以背包问题为例我们使用两个阵列value与itemvalue表示目前的最佳解所得之总价item表示最后一个放至背包的水果假设有负重量 1~8的背包8个并对每个背包求其最佳解逐步将水果放入背包中并求该阶段的最佳解放入李子背包负重 1 2 3 4 5 6 7 8 value 0004500 4500 4500 4500 9000 item ---00000放入苹果背包负重 1 2 3 4 5 6 7 8 value 0004500 5700 5700 5700 9000 item ---0 1 1 1 0放入橘子背包负重 1 2 3 4 5 6 7 8 value 02250 2250 4500 5700 6750 7950 9000 item -2 2 0 1 2 2 0放入草莓背包负重 1 2 3 4 5 6 7 8 value 11002250 3350 4500 5700 6800 7950 9050 item 3 23 0 1 3 2 3放入甜瓜背包负重 1 2 3 4 5 6 7 8 value 11002250 3350 4500 5700 6800 7950 9050 item 3 23 0 1 3 2 3由最后一个表格可以得知在背包负重8公斤时最多可以装入9050元的水果而最后一个装入的水果是3号也就是草莓装入了草莓背包只能再放入7公斤8-1的水果所以必须看背包负重7公斤时的最佳解最后一个放入的是2号也就是橘子现在背包剩下负重量5公斤7-2所以看负重5公斤的最佳解最后放入的是1号也就是苹果此时背包负重量剩下0公斤5-5无法再放入水果所以求出最佳解为放入草莓橘子与苹果而总价为9050元实作 Cincludeinclude define LIMIT 8 重量限制define N 5 物品种类define MIN 1 最小重量 struct bodychar name[20]int sizeint pricetypedef struct body object int main voidint item[LIMIT1] 0int value[LIMIT1] 0int newvalue i s p object a[] "李子" 4 4500 "苹果" 5 5700"橘子" 2 2250"草莓" 1 1100"甜瓜" 6 6700 for i 0 i N i for s a[i]size s LIMIT sp s - a[i]sizenewvalue value[p] a[i]priceif newvalue value[s] 找到阶段最佳解value[s] newvalueitem[s] iprintf "物品\t价格\n"for i LIMIT i MIN i i - a[item[i]]sizeprintf "s\td\n"a[item[i]]name a[item[i]]priceprintf "合计\td\n" value[LIMIT] returnJavaclass Fruitprivate String nameprivate int sizeprivate int price public Fruit String name int size int pricethisname namethissize sizethisprice pricepublic String getNamereturn namepublic int getPricereturn pricepublic int getSizereturn sizepublic class Knapsackpublic static void main String[] argsfinal int 8final int MIN 1int[] item new int[1]int[] value new int[1] Fruit fruits[]new Fruit "李子" 4 4500new Fruit "苹果" 5 5700new Fruit "橘子" 2 2250new Fruit "草莓" 1 1100new Fruit "甜瓜" 6 6700 fo。

三条边构成三角形c语言

三条边构成三角形c语言

三条边构成三角形c语言三条边构成三角形是初中数学学习中的一个基本定理。

利用这一定理,我们可以通过给定三条边长,来判断这三条边长是否能够构成一个三角形。

在编程中,我们也可以通过c语言编写程序来实现这一判断。

一、了解三角形的基本属性在编写程序之前,我们需要明确三角形的基本属性,这对后面进行判断非常重要。

三角形是由三条边所组成的一个几何图形,其基本属性包括三个角度、三个顶点、三个边长等。

根据勾股定理,我们知道当一个三角形的边长满足以下条件时,它才能成立:(1)任意两条边的长度之和要大于第三边的长度。

(2)任意两条边的长度之差要小于第三边的长度。

(3)三角形的三个角度之和为180度。

二、编写c语言程序接下来,我们就可以开始编写c语言程序来判断一组给定的三条边长是否能够构成一个三角形。

具体步骤如下:1.定义三个变量代表三角形的三条边长。

int a,b,c;2.使用scanf()函数从键盘输入三角形三条边的边长,将其依次赋值给变量a,b,c。

scanf("%d%d%d",&a,&b,&c);3.通过if语句判断三条边长度是否满足条件。

如果满足,则打印输出“可以构成三角形”,否则打印输出“不能构成三角形”。

if(a+b>c&&!((a-b)>c)){printf("可以构成三角形\n");}else{printf("不能构成三角形\n");}4.最后,使用return 0;语句结束程序。

完整代码如下:#include <stdio.h>int main(){int a,b,c;printf("请输入三条边长:");scanf("%d%d%d",&a,&b,&c);if(a+b>c&&!((a-b)>c)){printf("可以构成三角形\n");}else{printf("不能构成三角形\n");}return 0;}三、程序实现效果使用上述代码,我们可以实现对三条边长进行判断的功能。

帕斯卡算术三角形

帕斯卡算术三角形

帕斯卡算术三角形
帕斯卡算术三角形是一种数学图形,由数字组成的三角形,该图形的每一行数字都是上一行数字的加和。

例如,该三角形的第四行是
1,3,3,1,其中3=1+2,1=1+0。

帕斯卡算术三角形的应用非常广泛,其中包括组合数学、概率论、数论等。

下面将详细介绍这些应用。

组合数学是帕斯卡算术三角形最重要的应用之一。

例如,组合数指从n个不同元素中取出k个元素的方式数,用数学符号表示为C(n,k),可通过帕斯卡算术三角形轻松地得出。

具体来说,C(n,k)=第n行第k 个数。

例如,C(4,2)=第4行第2个数=3。

概率论也是帕斯卡算术三角形的重要应用之一。

例如,该三角形的第n行中的数字可以用来计算扔完n次硬币后正面朝上的次数的概率分布。

具体来说,扔n次硬币,正面朝上的次数为k的概率为
C(n,k)/2^n。

数论是帕斯卡算术三角形的另一个应用。

例如,该三角形中的每个数字都是一个二项式系数,也就是说,它们在二项式定理中起着重要的作用。

具体来说,二项式定理 (a+b)^n = C(n,0)a^n + ... +
C(n,k)a^(n-k)b^k + ... + C(n,n)b^n 将两个数的幂的和表示为一个帕斯卡算术三角形的行的线性组合,然后在二项式系数和多项式定理的上下文中使用。

此外,该三角形中还有一些有趣的性质和模式,这些也可以用于解决各种数学问题。

总之,帕斯卡算术三角形是一个非常有用的数学工具,可以在多个领域得到应用。

学生在学习数学时,可以充分了解该三角形的应用,加深对数学原理的理解和掌握。

编程新手的疑惑:代码循环如何画出一个简单的三角形

编程新手的疑惑:代码循环如何画出一个简单的三角形
简单的做法就是不打印那些存在奇数的行,也就是说在循环时,若发现列数columns - 星数line 为奇数,则不打印该行。
判断奇数的方法为 求余,如果余数为0,则为偶数,执行循环,如果余数为1,则跳过。
public class PrintTest { public static void main(String[] args) { int line = 9;
简单的做法就是结合之前的代码。
public class PrintTest {
public static void main(String[] args) { for (int i = 0; i < 3; i++) { System.out.print("*"); } System.out.println(); for (int i = 0; i < 3; i++) { System.out.print("*"); } System.out.println(); for (int i = 0; i < 3; i++) { System.out.print("*"); } System.out.println();
int columns = 9; for (int i = 0; i < line; i++) {
int loffset; int roffset; int odd = (columns - (i + 1 )) % 2; if (odd == 0) {
loffset = ( columns - (i + 1 ) ) / 2; roffset = loffset; for (int j = 0; j < columns; j++) {

求三角形的面积和周长c语言编程方法

求三角形的面积和周长c语言编程方法

求三角形的面积和周长c语言编程方法【原创实用版3篇】目录(篇1)一、引言二、三角形面积的计算方法1.海伦公式2.海伦公式的 C 语言实现三、三角形周长的计算方法1.周长公式2.周长公式的 C 语言实现四、总结正文(篇1)一、引言在数学和实际应用中,三角形是一个非常基本的形状。

计算三角形的面积和周长是常见的计算任务。

本文将介绍如何使用 C 语言编程实现三角形面积和周长的计算方法。

二、三角形面积的计算方法1.海伦公式海伦公式是一种计算三角形面积的公式,它的公式如下:面积 = sqrt[p * (p - a) * (p - b) * (p - c)]其中,a、b、c 是三角形的三边长,p 是三角形的半周长,即 (a + b + c) / 2。

2.海伦公式的 C 语言实现以下是使用 C 语言实现海伦公式计算三角形面积的示例代码:```c#include <stdio.h>float helen_area(float a, float b, float c) {float p = (a + b + c) / 2;float area = sqrt(p * (p - a) * (p - b) * (p - c)); return area;}int main() {float a, b, c;printf("请输入三角形的三边长:");scanf("%f %f %f", &a, &b, &c);float area = helen_area(a, b, c);printf("三角形的面积为:%.2f", area);return 0;}```三、三角形周长的计算方法1.周长公式三角形的周长公式为:周长 = a + b + c其中,a、b、c 是三角形的三边长。

2.周长公式的 C 语言实现以下是使用 C 语言实现周长公式计算三角形周长的示例代码:```c#include <stdio.h>float triangle_perimeter(float a, float b, float c) {float perimeter = a + b + c;return perimeter;}int main() {float a, b, c;printf("请输入三角形的三边长:");scanf("%f %f %f", &a, &b, &c);float perimeter = triangle_perimeter(a, b, c);printf("三角形的周长为:%.2f", perimeter);return 0;}```四、总结本文介绍了如何使用 C 语言编程实现三角形面积和周长的计算方法。

c语言直角三角形代码

c语言直角三角形代码

以下是一个简单的C语言程序,用于绘制一个直角三角形:
c复制代码
#include<stdio.h>
int main() {
int n;
printf("请输入直角三角形的行数:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
printf(" ");
}
for (int k = 1; k <= 2 * i - 1; k++) {
printf("*");
}
printf("\n");
}
return0;
}
程序首先要求用户输入直角三角形的行数,然后使用两个嵌套的循环来打印出三角形。

外层循环控制行数,内层循环控制每行的空格和星号数量。

在内层循环中,第一个循环用于打印空格,第二个循环用于打印星号。

注意,每行的星号数量是奇数,因此使用2 * i - 1来计算。

最后,程序打印一个换行符来结束当前行的输出。

C++用循环语句输出四种样式直角三角形

C++用循环语句输出四种样式直角三角形

C++用循环语句输出四种样式直角三角形
一、输出金字塔
在C++中,可以通过定义两个整型变量(以h和i为例),来输出金字塔样式的直角三角形,h表示高度,i表示列数,来实现如下代码操作:
```
//金字塔
for (int h = 0; h < 10; h++)
{
for (int i = 0; i < 10-h; i++)//此处注意需要-h,以便将输出缩进空格
{
cout<<"* ";
}
cout<<endl;
}
```
二、输出右边直角三角形
右边直角三角形可同样通过h和i两个变量,来实现代码操作,比如:
空心的直角三角形可以通过判断i和h的关系,来输出空心的样子,比如:
通过以上C++编程技巧,就可以实现输出四种样式的直角三角形。

c语言直角三角形构成条件 -回复

c语言直角三角形构成条件 -回复

c语言直角三角形构成条件-回复【C语言直角三角形构成条件】详解直角三角形是几何学中最基本的三角形之一,它的一个角度为90度。

在C语言中,我们可以使用一些条件来检查是否构成了直角三角形。

本文将逐步介绍C语言中构成直角三角形的条件,并解释每一步。

在C语言中,我们可以使用三边长度来确定一个三角形的形状。

根据直角三角形的定义,我们可以通过判断三边的关系来确定是否构成了直角三角形。

为了构成直角三角形,三边的关系必须符合以下条件:1. 三边必须满足勾股定理:a*a + b*b = c*c,其中a、b和c分别表示三角形的三边。

2. 三边中必须有一边的长度等于0,即a=0、b=0或c=0。

3. 三边中必须有一边的长度为负数,即a<0、b<0或c<0。

我们逐个解释这些条件:1. 勾股定理是一个数学公式,用来判断三边是否构成直角三角形。

根据勾股定理,当三边的关系满足a*a + b*b = c*c时,这个三角形是一个直角三角形。

其中,a、b和c分别表示三角形的三边长度。

在C语言中编写程序时,可以使用if语句结合数学运算符“==”(等于)来判断是否满足这个条件。

2. 当三条边中有一条边的长度为0时,这个三角形就是一个直角三角形。

因为当其中的一条边长度为0时,勾股定理的等式右边为0,所以等式成立。

在C语言中,可以使用if语句结合条件判断语句“a==0 b==0 c==0”来检查是否满足这个条件。

3. 当三条边中有一条边的长度为负数时,这个三角形就是一个直角三角形。

因为勾股定理的等式左边的结果必须大于等于0,而一条边的长度为负数时,等式左边的结果将小于0,所以等式不成立。

在C语言中,可以使用if语句结合条件判断语句“a<0 b<0 c<0”来检查是否满足这个条件。

在C语言中,我们可以编写一个函数来判断是否构成了直角三角形。

下面是一个示例函数的代码:cinclude <stdio.h>int isRightTriangle(int a, int b, int c) {if(a*a + b*b == c*c a==0 b==0 c==0 a<0b<0 c<0) {return 1; 构成直角三角形} else {return 0; 不构成直角三角形}}int main() {int a, b, c;printf("请输入三角形的三条边长度: ");scanf("d d d", &a, &b, &c);if(isRightTriangle(a, b, c)) {printf("构成直角三角形\n");} else {printf("不构成直角三角形\n");}return 0;}上述代码中,isRightTriangle函数用来判断三边长度是否满足直角三角形的条件。

倒三角c语言程序

倒三角c语言程序

倒三角c语言程序倒三角是一种经典的图形,它由一系列逐渐递减的字符构成,呈现出倒置的三角形的形状。

倒三角在计算机编程中也是一个常见的练手题目。

那么倒三角的历史又是怎样的呢?据历史学家研究,倒三角最早可以追溯至中国的汉朝。

当时,倒三角主要用作装饰画和器物上的图案,具有浓郁的中国文化特色。

而在宋代,倒三角逐渐成为书法练习的一道重要题目。

许多文人墨客都会在书法中使用倒三角,以表达自己深深的情怀和才华。

随着现代计算机技术的发展,倒三角也逐渐进入了程序员的视野。

人们开始使用计算机生成倒三角,不仅方便快捷,而且还可以按照不同的字符和符号进行定制。

对于程序员来说,实现倒三角需要使用编程语言。

在C语言中,可以使用for循环和嵌套循环的方式来实现倒三角。

下面是一段使用C 语言实现倒三角的程序:```#include <stdio.h>int main(){int n, i, j;printf("请输入倒三角的行数:");scanf("%d", &n);for(i=n;i>=1;i--){for(j=1;j<=n-i;j++)printf(" ");for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}return 0;}```以上程序通过输入行数n,使用for循环和嵌套循环来生成倒三角形状。

其中,第一个for循环控制行数,第二个for循环控制每行输出的空格,第三个for循环则控制输出的字符。

总的来说,倒三角作为一种传统的图案和书法练习题,历史悠久。

而在计算机编程中,倒三角也常常被用作入门练习和编程技能的考察。

虽然编写一个倒三角程序并不难,但在实现倒三角的过程中,我们也能够感受到C语言的简洁明了和编程思维的独特魅力。

c语言直角三角形构成条件_概述及解释说明

c语言直角三角形构成条件_概述及解释说明

c语言直角三角形构成条件概述及解释说明1. 引言1.1 概述直角三角形是几何学中最基本的三角形类型之一。

在C语言中,我们可以通过一定的条件来判断一个三角形是否为直角三角形。

本文旨在介绍C语言中直角三角形构成条件,并解释说明这些条件的作用和意义。

1.2 文章结构本文将分为五个主要部分进行阐述和探讨。

首先,在引言部分,我们将概述本文内容,并对文章结构进行简要介绍。

其次,在C语言直角三角形构成条件解释说明部分,我们将详细解释什么是直角三角形以及在C语言中它们的构成条件。

然后,在直角三角形的计算方法和公式介绍部分,我们将介绍一些常见的计算方法和公式,并通过示例代码与运行结果对其进行演示。

接着,在应用场景和实际问题解决方法讨论部分,我们将探讨直角三角形在建筑设计和计算机图形学等领域中的应用,并讨论实际问题的解决方法与优化探究。

最后,在结论与拓展思考部分,我们将总结回顾文章主要内容与观点阐述,并提出对于进一步研究和应用的展望与建议。

1.3 目的本文旨在向读者介绍C语言中直角三角形的构成条件,并提供相关的解释说明和实际应用讨论。

通过阅读本文,读者将能够了解到直角三角形的基本概念,掌握在C语言中判断一个三角形是否为直角三角形的方法,并深入了解其计算方法、公式和实际应用场景。

同时,本文还将给予读者拓展思考的机会,引发更多有关直角三角形的研究和应用方面的思考与讨论。

2. C语言直角三角形构成条件解释说明2.1 什么是直角三角形直角三角形是一种特殊的三角形,其中一个角为90度。

在几何学中,直角三角形有着独特的性质和特点。

2.2 C语言中的直角三角形构成条件在C语言中,判断一个三边长度是否可以构成直角三角形需要满足以下条件:- 任意两条边的平方之和等于第三条边的平方。

- 其中至少有一条边大于0。

通过这些条件,我们可以验证一个给定的三边长度是否能够组成直角三角形。

如果满足所有条件,则说明给定的三边可以构成一个直角三角形。

c语言直角三角形构成条件 -回复

c语言直角三角形构成条件 -回复

c语言直角三角形构成条件-回复C语言是一种高级计算机编程语言,常用于开发各种应用程序和系统软件。

在C语言中,我们可以使用不同的方式和技巧来构建各种形状的图案。

其中,直角三角形是一种常见的图案,它由三条边组成,其中两条边相互垂直。

在C语言中,要构成一个直角三角形,我们需要满足一定的条件。

首先,我们需要确定三个顶点的位置,然后确定它们之间的关系。

首先,我们需要确定三个顶点的位置。

在C语言中,我们可以使用坐标系来表示点的位置。

假设我们使用笛卡尔坐标系,其中原点(0,0)是屏幕的左上角,x轴向右延伸,y轴向下延伸。

假设直角三角形的一个顶点位于坐标系的原点(0,0),我们可以将其作为三角形的顶点A。

顶点B可以位于x轴上的某个位置(x,0),其中x大于零。

顶点C可以位于y轴上的某个位置(0,y),其中y大于零。

确定顶点位置之后,我们需要确定顶点之间的关系。

由于直角三角形的两条边是相互垂直的,我们可以使用直线的斜率来判断它们是否垂直。

直线的斜率可以通过两点之间的坐标差的比值来计算。

对于直线AB,如果斜率为k1,直线AC的斜率为k2,那么它们垂直的条件是k1 * k2 = -1。

在C语言中,我们可以使用以下代码来计算两点之间的斜率:cfloat slope(int x1, int y1, int x2, int y2) {return (float)(y2 - y1) / (float)(x2 - x1);}假设我们已经确定了顶点A、B和C的坐标,我们可以使用上述代码来计算直线AB和AC的斜率。

如果两条直线的斜率乘积等于-1,则它们是相互垂直的,即满足构成直角三角形的条件。

除了垂直的条件之外,我们还需要检查两边之间的长度是否满足勾股定理。

勾股定理可以用来判断一个三角形是否为直角三角形。

根据勾股定理,如果一个三角形的两条边的平方和等于第三条边的平方,则它是一个直角三角形。

在C语言中,我们可以使用以下代码来计算两点之间的距离的平方:cint distanceSquare(int x1, int y1, int x2, int y2) {int dx = x2 - x1;int dy = y2 - y1;return dx * dx + dy * dy;}假设我们已经确定了三个顶点A、B和C的坐标,我们可以使用上述代码来计算三条边的长度。

帕斯卡三角形

帕斯卡三角形

帕斯卡三角形
右图是在棋盘格上做成的行走路线、西北角是某人自己
的家,东南角是学校,问从自己家经东西5条街南北4条街
到学校〔最短距离〕有几种走法?
向东走一格写一个E ,向南走一个格写一个S ,例如沿着左图
的粗线走,表示为:EESESSEES 、因此将
E 和S 合起来9条通路中,选择四次S
即可,因此通路的,总数能够考虑为49C =126条、
那个问题到此已全部解决了、但是关于计算r n C 不熟悉的人
来说,如用下图交叉点处的圆表示,在圆中写上“到此为止行走的道路条数”,回答为126条,一看图形你就会马上明白了、
那个图在什么地方应见过,你还记得吗?它被称为“帕斯卡三角形”、用斜线连接的数的排列实际上正是n b a )( 展开时出现的系数、。

c语言直角三角形的判定

c语言直角三角形的判定

c语言直角三角形的判定C语言是一种广泛应用于计算机编程的编程语言,具有简单易学、高效灵活等特点。

在C语言中,我们可以通过一些简单的判断语句来判定一个三角形是否为直角三角形。

所谓直角三角形,就是其中一个角为90度的三角形。

我们可以通过三角形的边长关系来判断是否为直角三角形。

假设三角形的三条边长分别为a、b、c,其中c为斜边。

则直角三角形满足勾股定理,即a^2 + b^2 = c^2。

在C语言中,我们可以使用if语句来判断三角形是否为直角三角形。

具体的代码如下:```c#include <stdio.h>int main() {int a, b, c;printf("请输入三角形的三条边长:\n");scanf("%d %d %d", &a, &b, &c);if (a * a + b * b == c * c) {printf("这是一个直角三角形。

\n");} else {printf("这不是一个直角三角形。

\n");}return 0;}```以上代码中,我们首先定义了三个变量a、b、c来分别表示三角形的三条边长。

然后使用scanf函数接收用户输入的三个边长值。

接着使用if语句来判断是否满足勾股定理,如果满足,则输出"这是一个直角三角形",否则输出"这不是一个直角三角形"。

需要注意的是,在输入三角形的三条边长时,我们要保证输入的边长能够构成一个三角形。

根据三角形的性质,任意两边之和大于第三边,即a+b>c、b+c>a、c+a>b。

我们可以在接收输入后,加上这些判断条件,如下所示:```c#include <stdio.h>int main() {int a, b, c;printf("请输入三角形的三条边长:\n");scanf("%d %d %d", &a, &b, &c);if (a+b>c && b+c>a && c+a>b) {if (a * a + b * b == c * c) {printf("这是一个直角三角形。

算法:杨辉三角(PascalsTriangle)

算法:杨辉三角(PascalsTriangle)

算法:杨辉三⾓(PascalsTriangle)⼀、杨辉三⾓介绍 杨辉三⾓形,⼜称帕斯卡三⾓形、贾宪三⾓形、海亚姆三⾓形、巴斯卡三⾓形,是⼆项式系数的⼀种写法,形似三⾓形,在中国⾸现于南宋杨辉的《详解九章算法》得名,书中杨辉说明是引⾃贾宪的《释锁算书》,故⼜名贾宪三⾓形。

在那之前,还有更早发现这个三⾓的波斯数学家和天⽂学家,但相关的内容没有以图⽂保存下来,所以中国的数学家对此研究有很⼤贡献。

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 11 8 28 56 70 56 28 8 1 以上是杨辉三⾓的前 9 ⾏,可以看出来每⼀⾏的所有数字对应着⼆项式 (A+B)n 的展开式系数,这⾥ n 从第 0 ⾏开始。

⼆、杨辉三⾓的⼀些性质与实现此三⾓形的性质有(注:最顶的 1 处于第 0 ⾏):由正整数构成,每⼀⾏的数字左右对称;第(2的幂)⾏都是奇数;每⼀⾏数字之和都是2的幂;第N⾏数字个数都是N;第N⾏的第K个数字为组合数;除每⾏最左侧与最右侧的数字以外,每个数字等于它的左上⽅与右上⽅两个数字之和(也就是说,第 N⾏第 K 个数字等于第 N-1 ⾏的第 K-1 个数字与第K 个数字的和)。

因⽽固有恒等式: 可⽤此性质写出整个杨辉三⾓形。

1/**2 * 杨辉三⾓与 (a+b)^n ⼆项式系数的展开3 *4 * @param n5 * @param k6 * @return7*/8private static int binomialCoefficient(int n, int k) {9int res = 1;10if (k > n - k) {11 k = n - k;12 }13for (int i = 0; i < k; i++) {14 res *= (n - i);15 res /= (i + 1);16 }17return res;18 } 打印杨辉三⾓的函数:1/**2 * 打印杨辉三⾓3 *4 * @param n5*/6private static void printPascal(int n) {7for (int line = 0; line < n; line++) {8for (int i = 0; i <= line; i++) {9 System.out.print(binomialCoefficient(line, i) + " ");10 }11 System.out.println();12 }13 } 算法的时间复杂度⼤致为 O(N3),这⾥ N 为所打印杨辉三⾓的⾏数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档