注册 登录
编程论坛 闲聊灌水

来校第一天,打印沙漏,为什么满分12分,只拿到了4分

令狐少侠56 发布于 2015-09-14 13:10, 1675 次点击
觉得写的代码有点繁琐,而且没用函数封装起来,只拿到四分有点沮丧,下面是原题:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *
输出样例:

*****
 ***
  *
 ***
*****
2

[code]
#include "stdio.h"

int main()
{
    int N;
    int k,s;
    int i,t,h;
    char c;
    scanf("%d %c",&N,&c);

    //求第一行的*数
    for(k=1; ;k=k+2)
    {
        s=(1+k)*(k/2+1)-1;
        if(s>=N) break;
    }
    k=k-2;

    t=k;
    h=1;

    while(k>=1)
    {   
        for(i=1;i<h;i++ )
            printf(" ");
        for(i=1;i<=k;i++)
            printf("*");
            printf("\n");

        k=k-2;
        h++;
    }
   
    h=h-2;
    k=k+4;
    while(k<=t)
    {
        for(i=1;i<h;i++)
            printf(" ");
        for(i=1;i<=k;i++)
            printf("*");
        printf("\n");

        k=k+2;
        h--;
    }

    k=k-2;
    s=(1+k)*(k/2+1)-1;
    printf("%d\n",N-s);
    return 0;
}
21 回复
#2
冰镇柠檬汁儿2015-09-14 13:41
我有个想法,不知道合理不合理,你这样的写法确实没有用到更好的算法,并且也没有函数调用之类的,确实分数低正常
给你的数字,除以2,比如1000/2=500
然后已500为限,1+3+5+7+9....以此类推,一直到大于500时停止,这样得到的数字组成数组
用这个数组倒叙打印一次然后再正序打印一次,不就是沙漏了吗
具体的细节你再完善以下
其中整理成数组写一个函数,正序倒叙打印写两个,因为两个拆分,使用先后不同的执行顺序是可以得到沙漏和菱形两种不同图形的
这样写出来的程序,我估计能得8分


[ 本帖最后由 冰镇柠檬汁儿 于 2015-9-14 15:55 编辑 ]
#3
诸葛欧阳2015-09-14 14:05
给个提示,其实每行的符号都一样多,只是有的是空格有的是*
#4
令狐少侠562015-09-14 16:39
回复 4楼 诸葛欧阳
好像不是这个问题,我把代码改了下,可还是没满分,不知道他说的“最小N”是什么?
只有本站会员才能查看附件,请 登录

程序代码:
#include "stdio.h"

int main()
{
    unsigned int N;
    int k,s;
    int i,t,h;
    char c;
    scanf("%d %c",&N,&c);

    //求第一行的*数
    for(k=1; ;k=k+2)
    {
        s=(1+k)*(k/2+1)-1;
        if(s>=N) break;
    }
    k=k-2;

    t=k;
    h=1;

    while(k>=1)
    {   
        for(i=1;i<h;i++ )
            printf(" ");
        for(i=1;i<=k;i++)
            printf("%c",c);
        
            printf("\n");
   
        k=k-2;
        h++;
    }
   
    h=h-2;
    k=k+4;
    while(k<=t)
    {
        for(i=1;i<h;i++)
            printf(" ");
        for(i=1;i<=k;i++)
            printf("%c",c);
   
        printf("\n");

        k=k+2;
        h--;
    }   
    k=k-2;
    s=(1+k)*(k/2+1)-1;
    printf("%d\n",N-s);
    return 0;
#5
令狐少侠562015-09-14 16:41
回复 2楼 冰镇柠檬汁儿
恩恩,晚上试试看
#6
wp2319572015-09-14 16:45
最小的沙漏是由5个点组成
#7
冰镇柠檬汁儿2015-09-14 17:23
以下是引用令狐少侠56在2015-9-14 16:41:19的发言:

恩恩,晚上试试看

你居然是用软件打分的,我还以为是你们老师给判分的
我可不太懂c++,我只是基于javascript的随便说说的
#8
林月儿2015-09-14 20:30
回复 8楼 冰镇柠檬汁儿
是C语言啦
程序代码:
#include <stdio.h>
#include <math.h>
void draw(int n)
{
    for(int i=-n+1;i<n;i++)
      {
          if(i==0)
        {
             printf(" *\n");
             continue;     
        }
          for(int j=0;j<2*fabs(i)+1;j++)
          printf("*");
          printf("\n");
      }
}
main()
{
    int N;
//    printf("请输入N:");
//    scanf("%d",&N);
    for(int i=1;i<30;i++)
    {
        int n=sqrt((i+1)/2);
        printf("%d\n",i);
        draw(n);   
    }
}
#9
zklhp2015-09-14 20:33
以下是引用林月儿在2015-9-14 20:30:29的发言:

是C语言啦
#include
#include
void draw(int n)
{
    for(int i=-n+1;i

头像很好看
#10
林月儿2015-09-14 20:56
回复 10楼 zklhp
干嘛?
#11
TonyDeng2015-09-14 20:57
回复 11楼 林月儿
头像很好看,疯哥问你“还单吗?”
#12
林月儿2015-09-14 20:58
以下是引用TonyDeng在2015-9-14 20:57:23的发言:

头像很好看,疯哥问你“还单吗?”


疯哥是哪位啊?我是新来的,不懂诶
#13
令狐少侠562015-09-14 21:31
回复 10楼 zklhp
看头像加好友。。。。
#14
令狐少侠562015-09-14 21:42
回复 8楼 冰镇柠檬汁儿
看头像如此美女怎可随便说说。。。。。
#15
令狐少侠562015-09-14 22:12
回复 7楼 wp231957
每行都是奇数,最小1个*,然后到7个*吧
#16
冰镇柠檬汁儿2015-09-14 22:22
这要是js倒是好实现了,一个居中显示,都不需要考虑空格的问题
#17
TonyDeng2015-09-14 22:30
以下是引用冰镇柠檬汁儿在2015-9-14 22:22:04的发言:

这要是js倒是好实现了,一个居中显示,都不需要考虑空格的问题

居中可以自己现实函数的,然后就按js的模式写。觉得什么好,可以先实现了打基础,后面的就是依照原路去做——这就是用什么语言不重要的原因。把js中好的功能都用C实现了,语法和形式都差不多,那么后面写的C其实就是js。
#18
TonyDeng2015-09-14 22:37
回复 楼主 令狐少侠56
写程序,应该先铺好一叠白纸,在纸上写写画画,尤其是画图,深思熟虑之后再敲代码。现在你可能吃不透我这话是什么意思,如果将来有长进,还记得我说过这话的,自然明白,这可是传了真经给你。
#19
令狐少侠562015-09-14 22:58
回复 19楼 TonyDeng
是哒,抓紧练,缩小和大神们的差距
#20
令狐少侠562015-09-14 23:02
回复 17楼 冰镇柠檬汁儿
这么神奇的语言。。。
#21
冰镇柠檬汁儿2015-09-14 23:25
不神奇,tonydeng说的很对的,我只是玩笑一下,js是可以偷懒,但那样就达不到你在1楼写的题的练习目的了
1