L1-002 列印沙漏(找規律)
阿新 • • 發佈:2019-01-22
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
***** *** * *** *****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:19 *輸出樣例:
***** *** * *** ***** 2
#include<stdio.h> int main() { int n; char c; while(~scanf("%d %c",&n,&c)) { //只能輸出1個圖案的時候 if(n<7) { printf("%c\n",c); printf("%d\n",n-1); continue; } //找規律 int i,top,x,y,dis; for(i=1;i*i*2-1<=n;i++) { x=i*i; y=x-1; dis=n-x-y; } i--; top=2*i-1;//得出第1行的圖案的個數 //列印圖案 //第1行 for(int i=1;i<=top;i++) printf("%c",c); printf("\n"); //第2到最中間的一行 for(int i=2;i<=top/2+1;i++) { for(int j=1;j<=i-1;j++) printf(" "); for(int j=1;j<=top-(i-1)*2;j++) printf("%c",c); printf("\n"); } //最中間一行的下一行到倒數第二行 for(int i=top/2+2;i<=top-1;i++) { for(int j=1;j<=top-i;j++) printf(" "); for(int j=1;j<=top-(top-i)*2;j++) printf("%c",c); printf("\n"); } //最後一行 for(int i=1;i<=top;i++) printf("%c",c); printf("\n"); //輸出剩餘個數 printf("%d\n",dis); } return 0; }
有一個規律是 從1開始,連續奇數相加的和等於奇數個數的平方
證明
假設有n個從1開始的連續奇數相加,即1+3+5+…+(2n-3)+(2n-1),記為S=1+3+5+…+(2n-3)+(2n-1),改變一下S中各項的順序,將其中的數字倒序排列相加,同樣等於S(加法交換律),即S=(2n-1)+(2n-3)+…+3+1,將正序排列與倒序排列的這兩個S的等式左右相加,得到2S=2n+2n+…+2n,總共有n個2n,也即S=n+n+…+n,總共有n個n,也就是說S=nXn=n的平方.證畢.