沙漏列印問題 遞迴實現

2021-09-27 03:20:12 字數 1371 閱讀 3084

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個「*」,要求按下列格式列印

所謂「沙漏形狀」,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能多的符號。

輸入格式:

輸入在一行給出1個正整數n(≤1000)和乙個符號,中間以空格分隔。

輸出格式:

首先列印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

//沙漏列印問題

#include 

//遞迴計數,便於列印空格

int count = 0;

void printcharacter(int num, char ch);

void printspace(int num);

int main(void)

int total, n ,nsubtotal = 0;

char ch;

scanf("%d %c", &total, &ch);

//找到單行最大符號數的序號

for(n=1; subtotal<=total; n++)

subtotal=2*(n*n)-1;

//傳入單行最大符號數及符號

printcharacter(2*(n-2)-1, ch);

printf("%d\n", total-(2*(n-2)*(n-2)-1));

return 0;

void printcharacter(int num, char ch)

if(num>0)

printspace(count);

//列印字元

for(int i=0; iprintf("%c", ch);

//換行

printf("\n");

//呼叫遞迴次數加一

count++;

//遞迴呼叫

printcharacter(num-2, ch);

//列印字元

if(num!=1)

//呼叫遞迴次數減一

count–;

//列印空格

printspace(count);

for(int i=0; iprintf("%c", ch);

//換行

printf("\n");

else

count–;

return;

void printspace(int num)

for(int i=1; i<=num; i++)

printf(" ");

列印菱形 列印沙漏

輸入 輸出樣例輸入 5樣例輸出 提示 每行輸出最後乙個星號後面沒有空格 多組測試資料 include include 只需找出每一行和空格 之間的關係即可 intmain for z 1 z 2 i 1 z printf n for i n 1 i 1 i 行數後半段是前半段的顛倒 for z 2 ...

沙漏演算法列印

列印沙漏演算法計算題 include using namespace std int main else if number temp 2 a 2 while 1 經過確定之後的匹配最大的列印沙漏,列印的只是一部分的四分之一,並且將中間的位置在四分之一的計算過程,之後用a temp 1的方式反而將迴...

列印沙漏程式設計

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能多...