/* 问题:输入高度h,输出高为h,上底边围h的梯形 ------------ -------------- ---------------- ------------------ -------------------- 思路: 由于多出的底边x可以设为任意值,不放设x=h 第1行, h h 第2行,打印h-1个空格,1个*,然后打印h个空格,再打印1个* h+2*1 3 h-2 1 h+2*1 1个* h+2*2 4 h-3个空格,1个* h+2*2 1个* h-1 2 ,1个* h+2*(h-1-2)个空格,即h+2*(h-3),1个* i h+1-i 1个* h+2*(i-2)个空格,1个* h+2*(i-1) h 1个空格 ,3h个* 打印第一行时,先打印h个空格,再打印h个*号, 然后打印h个换行符 最后打印长度为2h个的*号 总结公式: print(*)= {h个空格,h个*,i=1 {1个空格,3h个*,i=h 错,是3h-2个*,因为,h最后一行有2个*公用了 {h+1-i个空格,1个*,h+2*(i-2)个空格,1个* */ //等腰梯形 /* #include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { int h,i; while(EOF!=scanf("%d",&h) && h >= 1 && h <= 1000) { int iLinNum = 1; while(iLinNum <= h) { if(iLinNum > 1 && iLinNum < h) { for(i = 1;i <= (h+1-iLinNum) ; i++) { printf("%c",' '); } /* printf("%c",'*'); for(i = 1; i <= (h+2*(iLinNum-2)) ; i++) { printf("%c",' '); } printf("%c",'*'); */ /* for(i = 1;i <= (h+2*(iLinNum-1)) ; i++) { printf("%c",'*'); } printf("\n"); iLinNum++; } else if(1==iLinNum) { for(i = 1 ; i <= h ; i++ ) { printf("%c",' '); } for(i = 1 ; i <= h ; i++ ) { printf("%c",'*'); } printf("\n"); iLinNum++; } else if(h==iLinNum) { printf("%c",' '); for(i = 1;i <= 3*h - 2 ; i++) { printf("%c",'*'); } printf("\n"); iLinNum++; }//else if }//while }//while system("pause"); getchar(); return 0; } */ /* 样例输入:4 输出: **** ****** ******** ********** 公式: 第一行h个*,前面空 h+2*(h-1)-h个空格= 2*(h-1)个空格 二 h+2个* i h+2*(i-1)个*,前面空 h+2*(h-1)-[h+2*(i-1)] = 2*(h-i)个空格 h h+2*(h-1)个* print(*) = {2*(h-i)个空格,h+2*(i-1)个*,第i行 */ #include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { int h,i; while(EOF!=scanf("%d",&h) && h >= 1 && h <= 1000) { int iLinNum = 1; while(iLinNum <= h) { for(i = 1 ; i <= 2*(h-iLinNum); i++) { printf("%c",' '); } for(i = 1; i <= h+2*(iLinNum-1) ; i++) { printf("%c",'*'); } iLinNum++; printf("\n"); } } system("pause"); getchar(); return 0; }