【C语言】BC68 X形图案题解

目录

问题描述

解题方法1:

(1)分析右三角

(2)分析左三角

  代码实现如下:

解题方法2:

代码实现如下:


BC68 X形图案题解

问题描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。

输入:

多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

输出:

针对每行输入,输出用“*”组成的X形图案。

解题方法1:

        本题的难点是‘*’和‘空格’是随着行数变化移动的,并打印了n行。

        同时当输入n为偶数和奇数时,打印效果也不一样,当n为偶数时,打印到(n/2)行和

((n/2)+1)行为‘**’。而n为奇数时,打印到((n/2)+(n%2))行为‘*’。

        在此我们可以采用分解问题的思想,把这个大问题看成打印两个‘三角的’问题。如下

        但我们把这两个三角打印并合并起来,本问题解决了。

        因为是多行多列打印,所以要用来两层for循环。

for (int i = 0; i < n; i++)
{
	for (int j = 0; j < n; j++)
	{

	}
}

(1)分析右三角

因为‘*’是从左逐渐向右跑,并且每次打印‘*’时i都等于j。

所以第一个条件是if(i==j)

 (2)分析左三角

这个也是比较难的,‘*’是从右向左跑,从(0,4)到(1,3)到(2,2)到(3,1)再到(4,0)

观察i和j坐标会发现(i+j=n-1)

所以第二个条件是if(i+j==n-1)

代码实现如下:

#include<stdio.h>
int main()
{
	int n = 0;
	while (scanf("%d", &n) != EOF)
	{
		int i = 0;
		int j = 0;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
			{
				if (i == j)
					printf("*");
				else if (i + j == n - 1)//因为行和列是从0开始的
					printf("*");
				else
					printf(" ");
			}
			printf("\n");
		}
	}
	return 0;
}

解题方法2:

        创建动态二维数组,并全部初始化为空格,然后在相应位置赋值为‘*’,之后并打印。

代码实现如下:

#include <stdio.h>

int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		char** arr = (char**)malloc(n * sizeof(char*));
		int k = n - 1;
		for (int i = 0; i < n; i++)
		{
			arr[i] = (char*)malloc(n*sizeof(char));
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if ((i == j) || (j == k))
				{
					arr[i][j] = '*';
					if (j == k)
					{
						k--;
					}
				}
				else {
					arr[i][j] = ' ';
				}
			}
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				printf("%c", arr[i][j]);
			}
			printf("\n");
		}
        free(arr);
	}
	return 0;
}

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱躺平的威威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值