PTA测试题- 打印沙漏(C语言)

发布于 / C语言 / Comments Off on PTA测试题- 打印沙漏(C语言)

题目:

第一次写这种东西,感觉写的超级麻烦,原本想用二维数组建立坐标系来做,结果发现好像更麻烦。。

上周用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");
  }
}

运行结果:


转载原创文章请注明,转载自: 斐斐のBlog » PTA测试题- 打印沙漏(C语言)
评论已关闭