如何在 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 < column)
'draws':
ABBBB
AABBB
AAABB
AAAAB
AAAAA
条件(column > 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
有点调皮,虽然它使 if
和 abs
更清晰。
#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');
【讨论】:
不错!但这需要另一个for
和if
——因为这是分配。 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 语句来绘制此图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用Assembler循环的情况下对3个变量进行排序?
C语言中,如何实现从文件中读取数据(大量的数据)后,在循环体中使用,每次传递3个值到数组。
Keras LSTM 在多类别分类中仅预测 1 个类别 - 如何修复?