可能上面的问题大家没有读懂,它的实际效果是这样的。
多组输入数据,由输入的数字来组成相应的空心正方形。
我最先看见这道题时,没有注意到星号后面跟着一个空格,于是我运行出来的效果时这样的:
我再那里左看右看的,硬是感觉一点也不像,才发现我没有把题看好。(苦命的孩子呀)
注意:星号后面有一个空格,所以我们可以把”* “(星号和空格)看作是一个整体。我们观察空心正方形时,会发现这样的规律。
假设我们输入的数是a,那么四条边,我们可以这样表示:
if (((i == 0) || (i == a - 1)) || ((j == 0) && ((i != 0) || (i != a - 1))) ||
((j == a-1 ) && ((i != 0) || (i != a - 1))))
//((i == 0) || (i == a - 1))//表示顶边和地边,i可以把它想成二维数组中的行
//((j == 0) && ((i != 0) || (i != a - 1)))//表示左边,j可以把它想成二维数组中的列,而且不包含第0列中的第一个点和最后一个点
((j == a-1 ) && ((i != 0) || (i != a - 1)))//表示右边,而且不包含第a-1列中的第一个点和最后一个点
但是一定要把握好与或运算,而且括号的使用也一定要恰当,稍不注意就会错!
那么接下来我们就来看看整体的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
while (scanf("%d", &a) != EOF)
{
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
if (((i == 0) || (i == a - 1)) || ((j == 0) && ((i != 0) || (i != a - 1))) ||
((j == a-1 ) && ((i != 0) || (i != a - 1))))
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");//一行打印完后,我们换行接着打印下一行。
}
}
return 0;
}
我们来看看运行效果:
OH!WHAT?WHY?究竟是哪里错了,这不科学呀。为什么最后一列会出现在那个地方呢?我在那里调整了半天,想着调整最后一行 j==2*a-1,但还是不行!
是哪里出了问题?就当我准备放弃去看看别人的思路时,我还是决定还是再想一想!突然想到前面是把星号和空格看作一个整体,但其实占据着两个位置。那么下面打印空格时,是不是也应该是两个空格呢?
是的,是两个空格,那么为什么最后一列出现在这里就讲得通了!
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 0; while (scanf("%d", &a) != EOF) { for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { if (((i == 0) || (i == a - 1)) || ((j == 0) && ((i != 0) || (i != a - 1))) || ((j == a-1 ) && ((i != 0) || (i != a - 1)))) { printf("* "); } else { printf(" "); } } printf("\n");//一行打印完后,我们换行接着打印下一行。 } } return 0; }
运行效果展示:
终于对了,但是我去看别人写的代码时,我心态崩了,他们写的好简单啊!
没事,毕竟是写出来了!(只能这样安慰自己了)
从中可以看出,原来我们有时离成功那么近,是不是应该咬牙多坚持一下呢,或许就真的成功了!!!
感兴趣的伙伴可以去了解其他的简单解题方法哦,今天就到此了,拜拜咯!