目录
循环变量初始化:i=0(行),j=0(列)循环条件:外循环i;内循环j<=i循环变量改变情况:i++,>
(1个内循环+if-else)循环变量初始化:i=1,j=1内循环if-else语句打印"* "条件:i>n-j(否则打印" ");循环变量改变情况:i++, j++
循环变量初始化:i=n(行),j=0(列)循环条件:外循环i>0;内循环j循环变量改变情况:i--,>
循环变量初始化:(2个内循环)i=n(行),j=0(列),k=0(列)循环条件:外循环i>0;内循环k,>
K形图案可以分解为两个部分:翻转直角三角形 + 直角三角形需要注意的是,翻转直角三角形的最后一行和直角三角形的第一行重合仅需翻转直角三角形少打印最后一行 或者 直角三角形从第二行开始打印即可
循环变量初始化:i=0(行),j=0(列:打印*号),k=n-1(列打印空格)循环条件:外循环ii, j<=i循环变量改变情况:i++, j++,k--;内循环k>
循环变量初始化:i=n(行),j=0(列:打印*号),k=0(列打印空格)循环条件:外循环i>0;内循环k,>
循环变量初始化:i=0(行),j=0(列:打印*号),k=0(列打印空格)循环条件:外循环i<=n;内循环k,>
循环变量初始化:i=n(行),j=0(列:打印*号),k=n(列打印空格)循环条件:外循环i>0;内循环k>=i, j循环变量改变情况:i--,>
循环变量初始化:i=0(行),kk=0(列)循环条件:外循环i;内循环>
循环变量初始化:i=0(行),k=n(列)循环条件:外循环ii+1, 内循环结束后再打印"*\n"循环变量改变情况:i++,k--;内循环>
循环变量初始化:i=0(行),j=0(列)循环条件:外循环i;内循环j
循环变量初始化:i=0(行),j=0(列)循环条件:外循环i0&&i0&&j)(否则打印">)&&(j>;内循环j
循环变量初始化:i=0(行),j=0(列)循环条件:外循环i;内循环j<=i,内循环if-else语句打印"*"条件:(i==n-1)||(j==0)||(j==i)(否则打印">
循环变量初始化:i=1(行),j=1(列)循环条件:外循环i<=n;内循环j<=i,内循环直接打印j的值就可以了,注意空格循环变量改变情况:i++,j++
前言
看到上面这些各式各样的精美图形,你是否会有尝试一下的冲动呢 ?本专题对部分常见的简单题做了一些分析和总结。
1.正方形
多组输入,对每组输入的n,输出一个n*n的正方形
正方形演示代码 int main() { int n; while (~scanf("%d", &n)) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) printf("* "); printf("\n"); } } return 0; }
2.直角三角形(左直角边)
循环变量初始化:i=0(行),j=0(列)
循环条件:外循环i<n;内循环j<=i
循环变量改变情况:i++, j++
直角三角形(左直角边)演示代码
int main() {
int n;
while (~scanf("%d", &n))
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
printf("* ");
printf("\n");
}
}
return 0;
}
3.直角三角形(右直角边)
(2个内循环)循环变量初始化:i=1(行),j=1(列:打印*号),k=1(列:打印空格)
循环条件:外循环i<=n;内循环(注意内循环的先后顺序)k<=n-1,j<=i
循环变量改变情况:i++, j++,k++
(1个内循环+if-else)循环变量初始化:i=1,j=1
内循环if-else语句打印"* "条件:i>n-j(否则打印" ");
循环变量改变情况:i++, j++
实际上很多2个内循环的问题都可以用if-else语句减少一个内循环
直角三角形(右直角边)演示代码
int main() {
int i, j, k;
while (~scanf("%d", &k))
{
for (i = 1; i <= k; i++)
{
for (j = 1; j <= k; j++)
{
if (i > k - j)
printf("* ");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
4.翻转直角三角形(左直角边)
循环变量初始化:i=n(行),j=0(列)
循环条件:外循环i>0;内循环j<i
循环变量改变情况:i--, j++
int main() {
int n;
while (~scanf("%d", &n))
{
int i, j;
for (i = n; i > 0; i--)
{
for (j = 0; j < i; j++)
printf("* ");
printf("\n");
}
}
return 0;
}
5.翻转直角三角形(右直角边)
循环变量初始化:(2个内循环)i=n(行),j=0(列),k=0(列)
循环条件:外循环i>0;内循环k<n-i, j<i
循环变量改变情况:i++, j++,k++
int main() {
int n;
while (~scanf("%d", &n))
{
int i, j, k;
for (i = n; i > 0; i--)
{
for (k = 0; k < n-i; k++)
{
printf(" ");
}
for (j = 0; j < i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
6.K形图案
K形图案可以分解为两个部分:翻转直角三角形 + 直角三角形
需要注意的是,翻转直角三角形的最后一行和直角三角形的第一行重合
仅需翻转直角三角形少打印最后一行 或者 直角三角形从第二行开始打印即可
int main() {
int n;
int i,j;
while(~scanf("%d",&n))
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n-i;j++)
printf("* ");
for(j=0;j<=i;j++)
printf(" ");
printf("\n");
}
for(i=n;i>=1;i--)
{
for(j=0;j<=n-i+1;j++)
printf("* ");
for(j=1;j<=i;j++)
printf(" ");
printf("\n");
}
}
return 0;
}
7.金字塔
循环变量初始化:i=0(行),j=0(列:打印*号),k=n-1(列打印空格)
循环条件:外循环i<n;内循环k>i, j<=i
循环变量改变情况:i++, j++,k--
int main() {
int n;
while (~scanf("%d", &n))
{
int i, j, k;
for (i = 0; i < n; i++)
{
for (k = n - 1; k > i; k--)
printf(" ");
for (j = 0; j <= i; j++)
printf("* ");
printf("\n");
}
}
return 0;
}
8.翻转金字塔
循环变量初始化:i=n(行),j=0(列:打印*号),k=0(列打印空格)
循环条件:外循环i>0;内循环k<n-i, j<i
循环变量改变情况:i--, j++,k++
int main() {
int n;
while (~scanf("%d", &n))
{
int i, j, k;
for (i = n; i > 0; i--)
{
for (k = 0; k < n - i; k++)
printf(" ");
for (j = 0; j < i; j++)
printf("* ");
printf("\n");
}
}
return 0;
}
9.菱形
菱形可以分解为两个部分:金字塔 + 翻转金字塔
int main() {
int n;
int i,j;
while(~scanf("%d",&n))
{
for(i=0;i<=n;i++)
{
for(j=0;j<n-i;j++)
printf(" ");
for(j=0;j<=i;j++)
printf("* ");
printf("\n");
}
for(i=n;i>=1;i--)
{
for(j=0;j<=n-i;j++)
printf(" ");
for(j=1;j<=i;j++)
printf("* ");
printf("\n");
}
}
return 0;
}
其实菱形也可以直接打印,但是难度更高
我们以输入n=4为例子,详细解析一下菱形图案
i<2*n+1 行
j<2*n+1 列
012345678
0 *
1 * *
2 * * *
3 * * * *
4* * * * *
5 * * * *
6 * * *
7 * *
8 *
整个菱形图案的中心点坐标为(n,n)
以(n,n)为中心,分别是一圈空格,一圈*号;
所有*号的存在范围边界线为菱形的4条边
这4条边内(包括边界线)的坐标点满足:|i-n| + |j-n| <= n ("|"为绝对值符号);
每一行*号和空格的间隔关系,与i、j、n的奇偶相关,找到它们的关系
(i + j + n)%2 == 0 就打印*号
请看代码
#include <stdio.h>
#include <math.h>
int main() {
int arr[100][100] = { 0 };
int n = 0;
while (~scanf("%d", &n))
{
int i, j;
int k = 2 * n + 1;
for (i = 0; i < k; i++)
{
for (j = 0; j < k; j++)
{
if ((abs(i - n) + abs(j - n) <= n) && (n + i + j) % 2 == 0)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
10.箭形图案
箭形可以分解为两个部分:斜三角形 + 翻转斜三角形
第一部分:
循环变量初始化:i=0(行),j=0(列:打印*号),k=0(列打印空格)
循环条件:外循环i<=n;内循环k<n-i, j<i+1
循环变量改变情况:i++, j++,k++
第二部分:
循环变量初始化:i=n(行),j=0(列:打印*号),k=n(列打印空格)
循环条件:外循环i>0;内循环k>=i, j<i
循环变量改变情况:i--, j++,k--
int main()
{
int n;
while (~scanf("%d", &n))
{
int i, j, k;
for (i = 0; i <= n; i++)
{
for (k = 0; k < n - i; k++)
printf(" ");
for (j = 0; j < i + 1; j++)
printf("*");
printf("\n");
}
for (i = n; i > 0; i--)
{
for (k = n; k >= i; k--)
printf(" ");
for (j = 0; j < i; j++)
printf("*");
printf("\n");
}
}
return 0;
}
11.反斜线图案
循环变量初始化:i=0(行),kk=0(列)
循环条件:外循环i<n;内循环 k<i, 内循环结束后再打印"*\n"
循环变量改变情况:i++,k++
int main()
{
int n;
while (~scanf("%d", &n))
{
int i, k;
for (i = 0; i < n; i++)
{
for (k = 0; k < i; k++)
printf(" ");
printf("*\n");
}
}
return 0;
}
12.正斜线图案
循环变量初始化:i=0(行),k=n(列)
循环条件:外循环i<n;内循环 k>i+1, 内循环结束后再打印"*\n"
循环变量改变情况:i++,k--
int main() {
int n, i, k;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (k = n; k > i + 1; k--)
printf(" ");
printf("*\n");
}
}
return 0;
}
13.X形图案
循环变量初始化:i=0(行),j=0(列)
循环条件:外循环i<n;内循环j<n,内循环if-else语句打印"*"条件:i==j || i+j==num-1(否则打印" ")
循环变量改变情况:i++,j++
int main()
{
int n;
while (~scanf("%d", &n))
{
int i, j;
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;
}
14.空心正方形
循环变量初始化:i=0(行),j=0(列)
循环条件:外循环i<n;内循环j<n,内循环if-else语句打印"*"条件:(i>0&&i<n-1)&&(j>0&&j<n-1)(否则打印" ")
循环变量改变情况:i++,j++
int main() {
int n;
while (~scanf("%d", &n))
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if ((i > 0 && i < n - 1) && (j > 0 && j < n - 1))
printf(" ");
else
printf("* ");
}
printf("\n");
}
}
return 0;
}
15.空心三角形
循环变量初始化:i=0(行),j=0(列)
循环条件:外循环i<n;内循环j<=i,内循环if-else语句打印"*"条件:(i==n-1)||(j==0)||(j==i)(否则打印" ")
循环变量改变情况:i++,j++
int main() {
int n;
while (~scanf("%d", &n))
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
if ((i==n-1)||(j==0)||(j==i))
printf("* ");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
16.数字三角形
循环变量初始化:i=1(行),j=1(列)
循环条件:外循环i<=n;内循环j<=i,内循环直接打印j的值就可以了,注意空格
循环变量改变情况:i++,j++
int main() {
int n;
while (~scanf("%d", &n))
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d ", j);
}
printf("\n");
}
}
return 0;
}