在一次采访中,我被要求编写一个代码,用于接受用户编号的函数,并打印如下所示的星号形状......
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;
}
任何想法我错过了什么?
答案 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;
}