C语言程序实现沙漏形状打印 - 详解与代码示例
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
原文地址: https://www.cveoy.top/t/topic/oNDN 著作权归作者所有。请勿转载和采集!