根据用户输入打印星形

时间:2015-04-16 01:35:23

标签: c

在一次采访中,我被要求编写一个代码,用于接受用户编号的函数,并打印如下所示的星号形状......

mraouf@mraouf-Inspiron-1525:~$ ./printStars 
Enter: 1
*
mraouf@mraouf-Inspiron-1525:~$ ./printStars 
Enter: 3
*
 *
*
mraouf@mraouf-Inspiron-1525:~$ ./printStars
Enter: 5
*
 *
* *
 *
*
mraouf@mraouf-Inspiron-1525:~$ ./printStars 
Enter: 7
*
 *
* *
 * *
* *
 *
*
mraouf@mraouf-Inspiron-1525:~$ ./printStars
Enter: 9
*
 *
* *
 * *
* * *
 * *
* *
 *
*

我尽我所能,但我无法达到要求的结果。这是我写的代码:

#include<stdio.h>

void printStars(int lines)
{
        int i,x;
        int half = (lines/2)+1;
        system("clear");
        for(i=1; i<half ; i++)
        {
                if ( i%2 == 0)
                {
                        printf(" ");
                }
                else
                {
                        printf("* ");
                }
                for(x=0; x<i-1; x++)
                {
                        printf("* ");
                }
                printf("\n");
        }
        for(i=half; i>0; i--)
        {
                if( i%2 == 0 )
                {
                        printf(" ");
                }
                for(x=i; x>0; x--)
                {
                        printf("* ");
                }
                printf("\n");
        }
}
int main (void)
{
        int num;
        printf("Enter:\n");
        scanf("%d", &num);
        printStars(num);
        return 0;
}

任何想法我错过了什么?

2 个答案:

答案 0 :(得分:2)

实际上这是垂直轴上的binomial distribution个星星。如果您注意到这一点,您可以优雅地解决这个问题。

分配系数定义为 n! / k! (n-k)!其中 k 成功可以在 n 试验中的任何地方发生。如果您在代码中定义递归因子函数并实现简单的二项分布公式(重构您的代码,因为 k 指的是星号字符,而 n 是指用户定义的数字),您可以轻松解决此问题。试一试,玩得开心:)

编辑: 伪代码示例可能如下所示:

int function getnumber();
int function factorial(n);

void function putstar(k)
{ 
   counter = factorial(n) / (factorial(k) * factorial(n - k));
   For(i=0; i < counter; ++i)
      print("*");
   print(new_line);
}

int function Main()
{
   n = getnumber();
   For(i=0; i <= n; ++i)
      putstar(i);
   print(new_line);
   exit();
}

答案 1 :(得分:1)

您的代码在迭代时打印了两个字符,需要打印一个字符(空格或*)。此代码保留了实现的风格,但产生了正确的结果。

#include <stdio.h>

void printStars(int lines)
{
        int i,x;
        int half = (lines/2)+1;
        system("clear");
        for(i=1; i<half ; i++)
        {
            for(x=i; x>0; x--)
            {
                if ( x%2 == 0)
                {
                    printf(" ");
                }
                else
                {
                    printf("*");
                }
            }
            printf("\n");
        }
        for(i=half; i>0; i--)
        {
            for(x=i; x>0; x--)
            {
                if ( x%2 == 0)
                {
                    printf(" ");
                }
                else
                {
                    printf("*");
                }
            }
            printf("\n");
        }
}
int main (void)
{
        int num;
        printf("Enter:\n");
        scanf("%d", &num);
        printStars(num);
        return 0;
}