この質問では、指定された記号を砂時計の形に印刷するプログラムを作成する必要があります。たとえば、17 "*"の場合、次の形式で印刷する必要があります。
*****
***
*
***
*****
いわゆる「砂時計の形」とは、各行が奇数のシンボルを出力すること、各行のシンボルの中心が整列すること、2つの隣接する行のシンボルの数が2異なること、シンボルの数が最初に減少することを意味します。最大から最小、1になり、次に最小から最大に増加します。数値は同じです。
N個の記号が与えられた場合、それは必ずしも砂時計を構成するわけではありません。印刷された砂時計は、できるだけ多くの記号を使用できる必要があります。
入力フォーマット:
正の整数N(≤1000)と記号をスペースで区切って1行に入力します。
出力フォーマット:
まず、指定された記号で構成される最大の砂時計の形状を印刷し、最後に未使用の記号の数を1行に出力します。
入力サンプル:
19 *
サンプル出力:
*****
***
*
***
*****
2
問題解決のアイデア:
/*
解题思路:
1)使用scanf函数接收符号数N和符号
2)因为是关于某一行(仅1个符号)对称:
total = 1;
i = 3;
while(total <= N) {
total += (2 * i);
i += 2;
}
// 输出的i - 2就是最后一行符号的个数,total - 2 * i 便是用的符号数
*/
コード:
# include <stdio.h>
int main() {
int N,total = 1,i = 3,j,k = 0,z = 0;
char st;
// 传入两个参数
scanf("%d %c",&N,&st);
while (total <= N) {
total += (2 * i);
i += 2;
}
// 用到的符号数,以及最后的i大小
i -= 2;
total -= 2*i;
i -= 2;
// 先开始倒着输出 ,空格数逐行加1
for(j = i;j >= 1;j -= 2) {
for(z = 0;z < k;z++) {
printf(" ");
}
for(z = 0;z < j;z++) {
printf("%c",st);
}
k += 1;
printf("\n");
}
// 现在开始正着输出,一个符号的行的空格数是:(j - 1) / 2个
k -= 2;
for(j = 3;j <= i;j += 2) {
for(z = 0;z < k;z++) {
printf(" ");
}
for(z = 0;z < j;z++) {
printf("%c",st);
}
k -= 1;
printf("\n");
}
printf("%d",N - total);
return 0;
}