在一行上输入一个整数
代表矩阵的大小。
输出一个
行
列的上三角蛇形矩阵。
4
1 3 6 10 2 5 9 4 8 7
第一步,
,将
;
第二步,
,将
、
;
第三步,
,将
、
、
;
第四步,
,将
、
、
、
。
#include <stdio.h> #include <stdlib.h> int main() { int num, i, j, count = 1; //num表示几行几列的上三角 scanf("%d", &num); if (num < 0 || num > 100) { return -1; } int** arr = (int**)malloc(num * sizeof(int*)); //申请空间 for (i = 0; i < num; i++) { arr[i] = (int*)malloc(num * sizeof(int)); //申请空间 } //赋值二维数组 for (i = 1; i <= num; i++) { for (int j = 0; j < i; j++) { /* 从0行开始,但是i初始化为1,所以减去一, * 再减去此刻j的值,光标跳入斜对角线下一个位置准备赋值 */ arr[i - 1 - j][j] = count; count++; } } //打印二维数组 //因为元素不会是0,故可以直接整个打印,由判断决定是否打印输出 for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { if (arr[i][j] > 0) { printf("%d ", arr[i][j]); } } printf("\n"); } //释放空间 for (i = 0; i < num; i++) { free(arr[i]); } free(arr); return 0; }
//老实人做法,蛇形赋值最后输出,通俗易懂 #include<stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { int arr[100][100], num = 1; int i = 0, j = 0; arr[0][0] = num++; while (j != n - 1) { if (i == 0) { i = j + 1; j = 0; arr[i][j] = num++; } arr[--i][++j] = num++; } for (i = 0; i < n; i++) { for (j = 0; j + i < n; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } return 0; }
#include <stdio.h> int main() { int a, b=1; scanf("%d",&a); for(int i=0;i<a;i++)//横行的等差数列比纵行的等差数列大1 { b+=i; int num=b; for(int j=i;j<a;j++) { if(j>i) num+=j+1; printf("%d ",num); if(j==a-1) printf("\n"); } } return 0; }
#include <stdio.h> #include <stdlib.h> int main() { int N = 0; int Slanted_rows = 1,element = 1; //以斜行的视角观察,初始只有1行斜行 scanf("%d\n",&N); int dim2_arr[100][100] = {0}; for(;Slanted_rows <= N;Slanted_rows++){ //斜行数小于等于总斜行数 for(int i = 0; i < Slanted_rows ; i++){ //观察到行列相加为总行数N - 1 dim2_arr[Slanted_rows - i - 1][i] = element; element++; } } for(int i = 0 ; i < N ; i++){ for(int j = 0; j + i < N; j++){ printf("%d ",dim2_arr[i][j]); } printf("\n"); } return 0; }
#include <stdio.h> #include <stdlib.h> int main() { int i = 0, j = 0, xstep = 0, ystep = 0; int row, col; scanf("%u", &row); col = row; unsigned int a[row][col]; memset(a, 0, sizeof(a)); a[0][0] = 1; for (i = 0; i < row;) { for (j = 1; j < col; j++) { a[i][j] = a[i][j - 1] + i + j + 1; } i++; j = 0; a[i][j] = a[i - 1][j] + i + j; } for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf("%d ", a[i][j]); } col--; printf("\n"); } return 0; }
#include <stdio.h> void prt(int head, int line, int n) { //单行打印函数 int i; for (i = 1 ; i <= n + 1 - line; i++) { //第 line 行打印 n-line+1 个数 printf("%d ", head); head += (line + i); //每行第 i 个元素相比前一个,大 line+1 } printf("\n"); } int main() { int n, i, head = 1; scanf("%d", &n); for (i = 1 ; i <= n ; i++) { //循环所有行 1~n行 head += (i - 1); prt(head, i, n); //每行调用单行打印函数 } return 0; }
#include <stdio.h> #include <stdlib.h> int main() { int n; int matrix[100][100] = {0}; int preFirstColi = 0; //存储第一列的上一次更新的的i,作为起始位置 scanf("%d", &n); for(int j=0, i=0, cur=1; ; cur++){//ij为矩阵的索引, cur为递增的自然数 matrix[i][j] = cur; //将cur放入矩阵, if(i==0){ //当递增到第一行 if(j == n-1) //判断是否已经到目标的n次,如是则退出 break; preFirstColi++; //不是则更新起始位置 i=preFirstColi; //更新ij j=0; }else{ //普通递增,则i-1, j+1 i--; j++; } } for(int i=0; i<100; i++){ //打印 for(int j=0; j<100; j++){ if(matrix[i][j]==0) break; printf("%d ", matrix[i][j]); } printf("\n"); } return 0; }
#include <stdio.h> int main() { int table[100][100]={1};//直接暴力拆解表格,然后根据要求进行输出 //可以看到,对于第一行来说,an=a(n-1)+n; //第二行则是an=a(n-1)+n+1; //第三行是an=a(n-1)+n+2; //以此类推 //第一列为bn=b(n-1)+n-1,依次确定初值。 int n; scanf("%d",&n); for(int i=0;i<n;i++){ if(i!=0) table[i][0]=table[i-1][0]+i; for(int j=0;j<n-i;j++){ if(j!=0){ table[i][j]=table[i][j-1]+(i+j+1); printf(" %d",table[i][j]); } else{ printf("%d",table[i][j]); } } printf("\n"); } return 0; }相比之下对于所有行同时找规律使用二维数组会比较麻烦一些,看到一个题解是对于逐行进行规律验证,先构建出第一行的初始值,然后按照每行分别找,这样会简单一些(因为只涉及一个变量的转换)
#include <stdio.h> int main(){ int n; scanf("%d",&n);int m=1;int q=2;int p; for(int i=0;i<n;i++){ p=i+1;m=q-1;//q用来记录上一行第二个数来确定本行第一个数,p为步长 for(int j=0;j<n-i;j++){ printf("%d ",m); if(j==1){ q=m; } p++;m+=p; } printf("\n"); } }
#include <stdio.h> #define suan(b) b*(b-1)/2+1 main(){ int n,addu,count,sum; scanf("%d",&n); //第一层 for(int i=1;i<=n;i++) { addu=i+1; count=1; sum=suan(i); printf("%d ",sum); for(int j=1;j<n+1-i;j++) { sum+=addu; printf("%d ",sum); addu++; if(count==n-i) printf("\n"); count++; } } return 0; }
#include <stdio.h> #define N 100 unsigned short arr[N][N] = {1}; main(){ unsigned short n; while(scanf("%hu", &n)!=EOF){ for(int i=0; i<n; ++i){ for(int j=0; j<n-i; ++j){ if(j==0) arr[i][0] = arr[i-1][0]+i; else arr[i][j] = arr[i][j-1]+i+j+1; printf("%hu ", arr[i][j]); } printf("\n"); } } }