【刷题C】打印沙漏

题目

在这里插入图片描述

答案代码

#include <cstdio>
using namespace std;
int main()
{
    
    
    int n,c,level = 1;//level为能打印的沙漏的最大层数,初始化为1
    int need_num = 1;//need_num为打印沙漏需要的符号个数
    scanf("%d",&n);//输入字符个数
    getchar();//吸收掉空格
    c = getchar();//输入字符
    while(n / need_num){
    
    //计算n个符号所能打印的“最大沙漏”(用掉的符号尽可能多,层数最大)
        level += 2;
        need_num += 2 * level;
    }
    need_num -= 2 * level;//退出循环时最多需要的符号个数多加了一次
    level -= 2;//退出循环时层数多加了一次(注意与上一行的顺序,不可颠倒)
    for(int i = level; i >= level / 2 + 1; i--){
    
    //先打印沙漏的上半部分及中心部分
        for(int k = 0; k < level - i; k++){
    
    //打印空格(符号数的相反数) 
            printf(" ");
        }
        for(int j = 0; j < 2 * i - level; j++){
    
    //打印符号	2 * i - level应该是自己总结的模型 
            printf("%c",c);
        }
        printf("\n");
    }
    for(int i = level / 2; i >= 1; i--){
    
    //再打印沙漏的下半部分
        for(int k = 0; k < i - 1; k++){
    
    //打印空格
            printf(" ");
        }
        for(int j = 0; j < level - 2 * (i - 1); j++){
    
    //打印符号
            printf("%c",c);
        }
        printf("\n");
    }
    printf("%d",n - need_num);//输出剩下没用掉的符号数
    return 0;
}

学习总结

  1. c语言好处,在printf处就可以强制类型转换
	int c;
	c = getchar();
	printf("%c",c);
  1. 此题重要隐藏条件:总层数 = 当前下最大列数
  2. /在判断中相当于>=
while(n / need_num){
    
    //计算n个符号所能打印的“最大沙漏”(用掉的符号尽可能多,层数最大)
        level += 2;
        need_num += 2 * level;
    }

而且这小段代码写的妙啊,两行解决问题

  1. 自己搭建需要用到的数学模型:例如这下面的2 * i - level
for(int j = 0; j < 2 * i - level; j++){
    
    //打印符号	2 * i - level应该是自己总结的模型 
            printf("%c",c);
        }
  1. 总结:整题满满的数学建模感~

猜你喜欢

转载自blog.csdn.net/m0_65431212/article/details/126627263