C语言程序实现沙漏形状打印 - 详解与代码示例

问题描述:

编写一个C语言程序,将给定的符号打印成沙漏的形状。例如,给定17个'*',要求按下列格式打印:


所谓'沙漏形状',是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

***** *** * ********2

分析:

本题思路较为清晰,按照题意模拟即可。不过需要注意一下两点:

  • 每行符号数的变化规律;每行符号数的变化规律是最麻烦的,但也不难。设每行符号数为 cnt,则有 cnt = 1 + 2 * (n - i),其中 n 是总符号数,i 是当前行号,i 从 0 开始计数。- 剩余符号的计算方式。沙漏的总符号数为 sum = 1 + 3 + 5 + ... + (2k + 1),其中 k 是沙漏的半个高度。因此我们可以先算出 k,然后计算 sum。剩余符号数即为 n - sum

**代码:**c#include <stdio.h>#include <math.h>

int main() { int n, i, j, k, sum, cnt; char symbol;

scanf('%d %c', &n, &symbol);

// 计算沙漏的半个高度k    k = (int)floor(sqrt(n));    // 计算沙漏的总符号数    sum = (2 * k + 1) * (k + 1) / 2;

// 如果n小于sum,则无法构成沙漏,输出'Invalid input'    if (n < sum) {        printf('Invalid input

'); return 0; }

// 打印沙漏的上半部分    for (i = 0; i <= k; i++) {        cnt = 1 + 2 * (k - i);        // 打印空格        for (j = 0; j < k - i; j++) {            printf(' ');        }        // 打印符号        for (j = 0; j < cnt; j++) {            printf('%c', symbol);        }        printf('

'); }

// 打印沙漏的下半部分    for (i = k - 1; i >= 0; i--) {        cnt = 1 + 2 * (k - i);        // 打印空格        for (j = 0; j < k - i; j++) {            printf(' ');        }        // 打印符号        for (j = 0; j < cnt; j++) {            printf('%c', symbol);        }        printf('

'); }

// 输出剩余符号数    printf('%d

', n - sum);

return 0
C语言程序实现沙漏形状打印 - 详解与代码示例

原文地址: https://www.cveoy.top/t/topic/oNDN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录