BC68 X形图案
一、题目概述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:
针对每行输入,输出用“*”组成的X形图案。
示例1
输入
5
输出
* *
* *
*
* *
* *
示例2
输入
6
输出
* *
* *
**
**
* *
* *
二、解题思路
从下图可以看到
正斜线下标都相等(i == j)
反斜线就两个数加起来也相等,即(i + j == n - 1)
三、代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int n = 0;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j || (i + j) == (n - 1))
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
BC69 空心正方形图案
一、题目概述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”正方形图案。
输入描述:
多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“*”的数量。
输出描述:
针对每行输入,输出用“*”组成的“空心”正方形,每个“*”后面有一个空格。
示例1
输入
4
输出
* * * *
* *
* *
* * * *
示例2
输入
5
输出
* * * * *
* *
* *
* *
* * * * *
二、解题思路
多层循环即可。
三、代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int a = 0;
while (scanf("%d", &a ) != EOF)
{
for (i = 1; i <= a; i++)
{
for (j = 1; j <= a; j++)
{
if (i == 1 || i == a)
{
printf("* ");
}
else if(j == 1 || j == a)
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
BC100 有序序列合并
一、题目概述
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:
输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
示例1
输入
5 6
1 3 7 9 22
2 8 10 17 33 44
输出
1 2 3 7 8 9 10 17 22 33 44
二、解题思路
首先先搞定输入,其中n和m的数据范围是1-1000,我们可以定义2个1000大小的数组存放数据。
接下来是合并问题
①因为两个数组都是有序数组,所以,我们可以用两个数组互相比较,哪个小先打印,然后对应的下标+1即可。
遇到的问题
两个数组可能会出现一个打印完了,另一个没打印完的情况。我们只需要再写一个循环,把剩余的打印出来即可。因为是有序数组,所以不用担心剩余的会比前面小的问题。
三、代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int arr1[1000] = { 0 };
int arr2[1000] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
for (j = 0; j < m; j++)
{
scanf("%d", &arr2[j]);
}
i = 0; //(1)i和j置0
j = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
while (i < n)
{
printf("%d ", arr1[i]);
i++;
}
while (j < m)
{
printf("%d ", arr2[j]);
j++;
}
return 0;
}
- (1)i和j要置0,否则i和j都是上一个循环后的数,是和n和m相等的,所以是不会输出任何结果的。
BC107 矩阵转置
一、题目概述
描述
KiKi有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答。
输入描述:
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
输出描述:
输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。
示例1
输入:
2 3
1 2 3
4 5 6
复制
输出:
1 4
2 5
3 6
二、解题思路
矩阵转置:把行变成列,把列变成行即可。
三、代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int i = 0;
int j = 0;
//int arr1[n][m]; //(1)
scanf("%d %d\n", &n, &m);
int arr1[n][m];
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr1[i][j]);
}
}
for (i = 0; i < m; i++)// 0 1
{
for (j = 0; j < n; j++)// 0 1 2
{
printf("%d ", arr1[j][i]);
}
printf("\n");
}
return 0;
}
- (1)数组的定义必须要在变量输入后定义,因为前面初始化n和m的时候,n和m的大小已经确定了(n=0,m=0),无法改变(变长数组)