原题链接:蛇行矩阵
这种题目往往都是找出各个元素之间的规律。
1 我们可以发现,每一行的首元素之间的规律为:
a(n) = a(n - 1) + n - 1;
a(1) = 1;
这个结论很容易就用一个for循环实现。
2 再找出每一行元素之间的规律:
当输入的正整数为N时,第rows行将要输出 N-rows+1 个元素,而每行首元素和首元素下一个元素之间的增量inc为 rows+1,往后元素之间增量加1。
知道上面的规律之后就可以写程序了,参考代码如下:
#include <stdio.h>
//N为总行数,rows为第几行,打印该行数据
void printN(int N, int rows)
{
//确定第rows行的第一个元素的值:a(n) = a(n-1) + n - 1; a1 = 1;
int first = 1;
int i;
for (i = 1; i <= rows; i++)
{
first += i - 1;
}
//第rows行的第一个元素为first
int tmp = first;
//第rows行的元素之间的增量inc从rows+1开始
int inc = rows + 1;
for (i = 1; i <= N - rows + 1; i++) //输出第rows行的元素,共有N-rows+1个
{
//输出元素时,该行最后一个元素后面没有空格符
if (i < (N - rows + 1))
printf("%d ", tmp);
else
printf("%d", tmp);
tmp += inc; //每一个元素都是前一个元素加上inc
inc++; //inc++
}
}
int main()
{
int N;
scanf("%d", &N);
//输出N行数据
int i;
for (i = 1; i <= N; i++)
{
printN(N, i);
printf("\n");
}
return 0;
}0.0分
40 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> #include<string.h> #define m 100 int main() { int n,a[m][m],l,l1,l2,l3; n=l2=l3=l=0; l1=2; memset(a,0,sizeof(int)); scanf("%d",&n); a[0][0]=1; for(int i=1;i<n;i++) //定义第一列// { l++; a[i][0]=l+a[i-1][0]; } l3=n; for(int j=0;j<n;j++) { l2=l1+j; for(int i=1;i<l3;i++) { a[j][i]=a[j][i-1]+l2; l2++; } l3--; } for(int j=0;j<n;j++) { for(int i=0;i<n;i++) { if(a[j][i]!=0) { printf("%d ",a[j][i]); } } printf("\n"); } return 0; }#include <iostream> using namespace std; int a[21][21]; int main() { int n,num=1,i,k,q; cin>>n; for(int i=1;i<=n;i++){ q=1; for(int k=i;k>=1;k--){ a[k][q]=num; num++; q++; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(!a[i][j]) continue; cout<<a[i][j]<<" "; } cout<<endl; } return 0; }#include<stdio.h> int main() { int n,a=0; scanf("%d",&n); for(int i=1;i<n+1;i++) { for(int j=i;j<n+1;j++) { a+=j; printf("%d ",a); } printf("\n"); a=((i+1)*i)/2-i; } }递归法,不过时间复杂度还是O(n²),比较麻烦 #include<stdio.h> int head(int n){ if(n == 1){ return 1; }else{ return head(n - 1) + n - 1; } } int main() { int n; scanf("%d", &n); for(int i = 1; i <= n; i++){ int d = i; printf("%d ", head(i)); int sum = 0; for(int j = n - i; j >= 1; j--){ d += 1; sum += d; if(j != 1){ printf("%d ", head(i) + sum); }else{ printf("%d\n", head(i) + sum); } } } }#include<iostream> using namespace std; int main() { int n; cin>>n; int a[n][n]; int i,j; int v=1; a[0][0]=1; for(i=1;i<n;i++) { a[i][0]=a[i-1][0]+i; } for(i=0;i<n;i++) { for(j=1;j<=n-i-1;j++) { a[i][j]=a[i][j-1]+j+1+i; } } for(i=0;i<n;i++) { for(j=0;j<=n-i-1;j++) { cout<<a[i][j]<<" "; } cout<<endl; } }#include<iostream> using namespace std; int main() { int n; cin>>n; int a[n][n]; int i,j; int v=1; a[0][0]=1; for(i=1;i<n;i++) { a[i][0]=a[i-1][0]+i; } for(i=0;i<n;i++) { for(j=1;j<=n-i-1;j++) { a[i][j]=a[i][j-1]+j+1+i; } } for(i=0;i<n;i++) { for(j=0;j<=n-i-1;j++) { cout<<a[i][j]<<" "; } cout<<endl; } }