在一行上输入一个整数
代表矩阵的大小。
输出一个
行
列的上三角蛇形矩阵。
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");
}
}
}