刘姥姥卖牛奶 2021-11-19 00:51 采纳率: 50%
浏览 189
已结题

pta-打印沙漏,试了很多次总有一个测试点无法通过,求指点迷津

问题遇到的现象和发生背景

题目:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印



*



所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
结尾无空行
输出样例:



*



2

遇到的问题:在pta提交时,总是遇到一个测试点无法通过,但是代码在运行测试那块运行和在编译器上运行都是正确的

img

问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<math.h> 
int main()
{    int a,n=1,k=0,bottle=0;
    char ch;
    int sum=-1,bn=1;   //计前n项和、通项公式 
    int count=1;  //统计空格数 
    scanf("%d %c",&a,&ch);  
    while(sum+2*(2*n-1)<=a){
        sum+=2*(2*n-1);
        n++;
        k++;
    }
    int l;
    l=k;
    for(int z=1;bn>=1;z++)
    { 
        bn=2*k-1;
        for(int j=1;j<=bn;j++)
        {
            printf("%c",ch); } 
         if(bn!=1)
         {
             printf("\n");
            for(int z=1;z<=count;z++)
             {
                printf(" ");}   }
        else
        break;
        count++;
         k--;}
    printf("\n");
    k=l;
    int f=2*k-1;
    bottle=count-2;
    for(int i=2;bn<f;i++)
    {
        bn=2*i-1;
        if(bn!=f)
        for(int k=1;k<=bottle;k++)
       {
          printf(" ");    }
        for(int j=1;j<=bn;j++)
        {    
            printf("%c",ch);}
        printf("\n");        
        bottle--;
    }
     if(a-sum==0)
     return 0;
      else 
     printf("%d",a-sum); 
 } 
运行结果及报错内容

img

我的解答思路和尝试思路

通过等差数列前n项和、等差数列通项公式打印沙漏

我想要达到的结果

所有测试点都通过测试

img

  • 写回答

1条回答 默认 最新

  • 关注

    如果没用掉的符号数为0 也应该输出0啊,题目没说为0就不用输出了吧。

    #include<stdio.h>
    #include<math.h>
    int main()
    {    int a,n=1,k=0,bottle=0;
        char ch;
        int sum=-1,bn=1;   //计前n项和、通项公式
        int count=1;  //统计空格数
        scanf("%d %c",&a,&ch);
        while(sum+2*(2*n-1)<=a){
            sum+=2*(2*n-1);
            n++;
            k++;
        }
        int l;
        l=k;
        for(int z=1;bn>=1;z++)
        {
            bn=2*k-1;
            for(int j=1;j<=bn;j++)
            {
                printf("%c",ch); }
             if(bn!=1)
             {
                 printf("\n");
                for(int z=1;z<=count;z++)
                 {
                    printf(" ");}   }
            else
            break;
            count++;
             k--;}
        printf("\n");
        k=l;
        int f=2*k-1;
        bottle=count-2;
        for(int i=2;bn<f;i++)
        {
            bn=2*i-1;
            if(bn!=f)
            for(int k=1;k<=bottle;k++)
           {
              printf(" ");    }
            for(int j=1;j<=bn;j++)
            {
                printf("%c",ch);}
            printf("\n");
            bottle--;
        }
        printf("%d",a-sum);
        return 0;
    }
    
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月30日
  • 已采纳回答 11月22日
  • 创建了问题 11月19日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料