算法题目
-
找规律的打印表问题一直是我的痛点,就算有时候我找出规律来了,我也不知道怎么编程打印出来,更何况有时候找不出来规律~
-
这个题目其实规律很简单,一眼就可以看出来
-
关键是我们要怎么设计一个算法把它打印出来
算法分析
-
首先对于任意一个问题,我们不能仅仅停留在这个问题表面,要发现这一类问题,比如这个就是演化成一个n✖n数组
-
其次要明确数组一般是进行行和列操作的,但是我们在找规律的时候,有时不是在行和列上找到规律的,这时我们可以根据已经找到的规律的基础上,再变换成行和列上来
针对这个问题:
我们可以变换思维,在所找规律的基础上,把其当作正常的行和列,找出行和列以及n的关系,如下:
然后找出已有规律后,还需要把这个规律转换为正常的行和列上来,方便后续操作
详细分析如下:
代码实现
#include<stdio.h>
int main()
{
int i,j,n,k=1; //矩阵从1开始
scanf("%d",&n); //n代表n ✖ n矩阵(按照实际输出计算的话)
int a[n+1][n+1]; //数组下标从0开始 但我们是从1开始 所以多定义一个,否则容易数组下标越界(注意)
for(i=1;i<=n;i++) //i表示层行序
{
for(j=1;j<=n+1-i;j++) //j表示层列序
{
a[i-1+j][j]=k; //把层行序和列序转换成正常行和列存储
k++;
}
}
printf("\n");
for(i=1;i<=n;i++) //正常行序
{
for(j=1;j<=i;j++) //正常列序
{
printf("%d ",a[i][j]); //按照正常行列输出
}
printf("\n");
}
return 0;
}
结果示例
- 示例一
- 示例二
- 示例三
一般类似于找规律的问题,如果事先把所有工作都做了,那么写的代码就会很简单,但是读者理解起来就会有点困难;如果事先没有充分的准备,那么暴力代码解决,相对来说写的就会有点多~