蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
例如,当输入5时,应该输出的三角形为:
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
#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"); } } }
#include <stdio.h> #include <math.h> void main() { int number = 0; int i = 0, j = 0, k = 0; while (scanf("%d", &number)) { number = number + 1; for (i = 1; i <= number; i++) { for (j = 1; j <= number - i; j++) { k = (int)(pow(j + i - 1, 2) + j + i - 1) / 2 - (i - 1); printf("%d", k); if (j < number) { printf(" "); } } printf("\n"); } } }
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ int num; scanf("%d\n", &num); if( num > 100 ){ printf("num must be less than 100."); return 0; } int arr[num][num]; int i,j,x; int m, n; int k = 1; memset(arr, 0, sizeof(arr)); for(x = 0; x < num ; x++){ i = x; while( i >= 0 ){ for(j = 0 ; j <= x ; j++){ arr[i][j] = k; k++; i--; } } } int tmp = num; for(m = 0; m < num ; m++){ for(n = 0; n < tmp ; n++){ printf("%d ", arr[m][n]); } tmp--; printf("\n"); } return 0; }
#include <stdio.h> int iLineBuff[101]; void genFirstLine(int *buf, int len) { int i; int temp = 0; for(i=1;i<=len;++i) { buf[i] = i * i - temp; temp = buf[i]; } } void printTriangle(int *buff, int len) { int i, j; for(i=1;i<=len;++i) { for(j=i;j<=len;++j) { printf("%d ", buff[j]--); } printf("\n"); } } int main() { int len; while(EOF != scanf("%d", &len)) { genFirstLine(iLineBuff, len); printTriangle(iLineBuff, len); } return 0; }