题目:
第一次写这种东西,感觉写的超级麻烦,原本想用二维数组建立坐标系来做,结果发现好像更麻烦。。
上周用PHP做了一个,(传送门:https://www.mmuaa.com/post-25.html),两者思路有区别,PHP的那个对于输入"1 *"无法打印正确的结果(所以说有很多bug。。。)
C代码:
#include "stdio.h"
int used(int);
int line(int);
void out(int,char);
int main()
{
/*初始化变量*/
int n, remain, use, lin;
char str;
scanf("%d %c", &n, &str); /*str为组成沙漏的字符,n为个数*/
use = used(n); /*使用字符的个数*/
lin = line(use); /*使用的行数*/
out(lin, str); /*输出*/
printf("%d", n - use); /*输出没使用的个数*/
return 0;
}
int used(int n){
if (n == 1){
return 1;
}
int count = 1;
int line = 1;
while (count < n){
line++;
count += (2 * (2 * line - 1));
}
count -= (2 * (2 * line - 1));
return count;
}
int line(int n){
if (n == 1){
return 0;
}
int count = 1;
int line = 1;
while (count < n){
line++;
count += (2 * (2 * line - 1));
}
return line-1;
}
void out(int n,char str){
int count = 0; /*计算空格数*/
if (n == 0){ /*如果只有中心的一行的情况*/
printf("%c\n",str);
return;
}
for (int i = n; i != 0; i--){
for (int ii = 0; ii != count; ii++){
printf(" ");
}
for (int ii = 0; ii != (2 * i + 1); ii++){
printf("%c",str);
}
printf("\n");
count++;
}
for (int i = 0; i != count; i++){
printf(" ");
}
printf("%c\n", str);
for (int i = 1; i != n+1; i++){
count--;
for (int ii = count; ii != 0; ii--){
printf(" ");
}
for (int ii = 0; ii != (2 * i + 1); ii++){
printf("%c", str);
}
printf("\n");
}
}
运行结果: