如何在 C 中仅使用 2 个循环和 1 个 if 语句来绘制此图?

Posted

技术标签:

【中文标题】如何在 C 中仅使用 2 个循环和 1 个 if 语句来绘制此图?【英文标题】:How to draw this figure with only 2 loops and 1 if statement in C? 【发布时间】:2013-10-07 19:58:54 【问题描述】:

如何在 C 中用 2 个 for 循环和 1 个 if 语句绘制这样的图形?

AAAAA
AAAAB
AAABB
AAAAB
AAAAA

我知道我必须比较行和列,但我不知道如何得到确切的结果。

它必须适用于大于 0 且小于 24 的每个数字。

到目前为止,我所做的如下:

for (row = 1; row <= n; row++)

    for (column = 1; column <= n; column++)
    
        if ( row >= column )
        
            printf("A");
        
        else
        
            printf("B");
        
    
    printf("\n");

这给了我这个 n = 5:

ABBBB
AABBB
AAABB
AAAAB
AAAAA

【问题讨论】:

“我知道我必须……” 全部在空中?尝试一些事情,然后回到这里澄清/怀疑/错误 我在回答中添加了一般情况。 【参考方案1】:

给你:

for (row = 1; row <= 5; row++)

    for (column = 1; column <= 5; column++)
    
        if ( (row < column) && (column > 5 - row + 1) )
        
            printf("B");
        
        else
        
            printf("A");
        
    
    printf("\n");

demo

解释:

条件(row &lt; column)'draws':

ABBBB
AABBB
AAABB
AAAAB
AAAAA

条件(column &gt; 5 - row + 1)'draws':

AAAAA
AAAAB
AAABB
AABBB
ABBBB

这些条件的组合就是你的结果。

【讨论】:

它必须适用于大于 0 且小于 24 的每个数字。 因此将出现的 5 更改为 n。并且不要忽略关键点;这对那些试图帮助你的人是不公平的。 哦,移动规格的乐趣。项目管理职业肯定在等着你。 我刚刚又试了一次,有了这个解决方案,它只有在数字是偶数的情况下才能正常工作。当数字不均匀时它不能正常工作,因为在中间你没有一个B,而是两个B。 不均匀数字的输出是什么?举个例子 n=6【参考方案2】:

python代码(下面翻译成C):

for i in range(5):
    for j in range(5):
        if(i-j<0 and i+j>4):
            print("B",end="")
        else:
            print("A",end="")
    print()

C:

for(int i=0;i<5;i++)

   for(int j=0;j<5;j++)
   
       if(i-j<0 && i+j>4) printf("B");
       else printf("A");
   
   printf("\n");

你还记得几何中的 x=y 和 x=-y 线吗?解是半平面的交点。

查看this 了解其背后的几何概念。

更新: 您还指出它应该适用于一般情况,所以:

int n = SIZE;
for(int i=0;i<n;i++)

   for(int j=0;j<n;j++)
   
       if(i-j<0 && i+j>(2*(n/2)) printf("B");
       else printf("A");
   
   printf("\n");

【讨论】:

当然可以,但是我用几何解决了,所以它更好地代表了线条的概念。【参考方案3】:

这是一种方式;请注意我如何利用输出的对称性将行计数器从 -2 运行到 +2。我倒数 col 有点调皮,虽然它使 ifabs 更清晰。

#include "stdio.h"

int main()

    for (int row = -2; row <= +2; ++row)
        for (int col = 5; col >= 1; --col)
            if (col > 2 - abs(row))
                printf("A");
             else 
                printf("B");
            
        
        printf("\n");
    

请注意,由于我在 for 循环中放置了 int,因此您至少需要 C99 来编译它。

【讨论】:

【参考方案4】:

单循环:

for(i=0; i<30; ++i) putch(i%6==5?'\n':i%6-(i/6-2)*(i/6-2)<3?'a':'b');

【讨论】:

不错!但这需要另一个forif——因为这是分配。 if(true) 在前面工作,但是 for..loop ... 不引入不必要的未使用变量呢?【参考方案5】:

跟随可能不如其他有效,但您可以简单地生成分析对称性的模式

                        n=9
                n=7     0
        n=5     0       1
AAAAA   0       1       2
AAAAB   1       2       3
AAABB   2       3       4
AAAAB   1       2       3
AAAAA   0       1       2
                0       1
                        0

所以:

void generate_AB(int n, int i)

 int j;
   for(j=1;j<=n-i;j++) //n-i no. of As
      printf("A"); 
   for(j=1;j<=i;j++) // i no. of Bs
      printf("B");
      printf("\n");


int main()

  int i,j,n=5;

    for(i=0;i<=n/2;i++)  // Count 0 to INT(n/2)
        generate_AB(n,i);

    for(i=n/2-1;i>=0;i--) // Count  INT(n/2)-1 to 0
        generate_AB(n,i);

    return 0;

【讨论】:

以上是关于如何在 C 中仅使用 2 个循环和 1 个 if 语句来绘制此图?的主要内容,如果未能解决你的问题,请参考以下文章

在 Cypress 中使用 2 个条件和 IF 语句

如何在不使用Assembler循环的情况下对3个变量进行排序?

C语言中,如何实现从文件中读取数据(大量的数据)后,在循环体中使用,每次传递3个值到数组。

Keras LSTM 在多类别分类中仅预测 1 个类别 - 如何修复?

如何在多个(超过 2 个)集合中仅强制一组字段为非 NULL?

如何从 S3 存储桶中仅读取最近 7 天的 csv 文件