这种题目往往都是找出各个元素之间的规律。

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;
}


点赞(6)
 

0.0分

40 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 33 条评论

阿轩请求出战 4年前 回复TA
#include <stdio.h>
int main() {
    int a[100],s,p = 0,q = 0;
    scanf("%d",&s);
    for (int i = 1; i < 101; ++i) {
        a[i- 1] = i;
    }
	for (int k = 1; k <= s; k++) {
		q += k - 1;                 //a(n) = a(n - 1) + n - 1;
		p = q;
		for (int j = 1; j < s - k + 2; ++j) {
			printf("%d",a[p]);
			if(j != s) printf(" ");//当该数字不为行末时,加空格
			p += j + k;             //第k行的元素之间的增量从k+1开始
		}printf("\n");
	}
    return 0;
}
清月独酌 4年前 回复TA
求大佬解惑,运行不出来,,,,,



#include<stdio.h>
main()
{
    int i,j,m=0,k,i2;
	scanf("%d",k);
	int a[k][k];
	for(i=0;i<=k-1;i++)
	{for(i2=i;i2>=0;i2--)
	for(j=0;j<=i;j++)
	a[i2][j]=++m;}
	for(i=0;i<=k-1;i++)
	{for(j=0;j<=4-i;j++)
	printf("%d ",a[i][j]);
	printf("\n");
	} 
}
Logan 4年前 回复TA
不用这么麻烦~
#include <stdio.h>

int main()	// 洛谷:问题 1097: 蛇行矩阵
{
	
	int N;
	scanf("%d", &N);
	int i, j, down = 1, right;
	for(i = 0; i < N; i++){
		down += i;
		right = down;
		printf("%d ", down);
		for(j = i+1; j < N; j++){
			right = right + j+1;
			printf("%d",right);
			if(j!=N-1) printf(" ");
		}
		printf("\n");
	}
	
	return 0;
}
菜鸟阿壹 4年前 回复TA
#include<stdio.h>
int main()
{
	int N,m,n,k,a[100][100];
	scanf("%d",&N);

	a[0][0] = 1;
	k=N;
	for (n=0;n<N;n++)
	{
	
		for (m=0;m<k;m++)
		{
			a[n][m+1]=a[n][m]+n+m+2;
			printf("%d ", a[n][m]);
		}
		printf("\n");
		k--;
		a[n+1][0] = a [n][0]+ n+1 ;
	}
	return 0;
}
lwd 5年前 回复TA
#include<stdio.h>
int main(void)
{
	int n;
	while (scanf("%d", &n)!=EOF)
	{
		int i, j, s;
		int z[100][100] = { {0} };
		z[0][0] = 1;
		for (i = 1; i < n; i++)
			z[0][i] = z[0][i - 1] + i + 1;
		s = 2 * n - 3;
		for (j = n - 2; j >= 0; j--)//列不变,行变化
		{
			for (i = 1; i <= s; i++)
				z[i][j] = z[i - 1][j + 1] - 1;
			s--;
		}
		s = n;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < s; j++)
				printf("%d ", z[i][j]);
			s--;
			puts("");
		}
	}
	return 0;
}
蕉下客 5年前 回复TA
为啥我这个提交之后答案错误呀,我自己测试没有错误呀
/* C算法97-蛇形矩阵 */
#include<stdio.h>
int main(){
	int n,i,j;
	int k=1,t=1,p=0;
	printf("请输入行数: ");
	scanf("%d",&n);
  if(n<=100){
	
	for(i=1;i<=n;i++){//i 行  j列 
		t=t+i-1;  //确定各行的第一个元素 
		k=t;
		
		for(j=1;j<=n+1-i;j++){
			printf("%d\t",k);
			k=k+j+1+p;  //确定一行中各个元素的值 
		}
		p++;
		printf("\n");
	}
 } 
	return 0;
}
斯宾塞 5年前 回复TA
#include<stdio.h>
void main()
{
	int a,i,j,k=1;
	int b[100][100]={0};
	while((scanf("%d",&a))!=EOF&&(a>0&&a<=100))
	{
		b[0][0]=1;
		printf("%d",b[0][0]);
		for(i=1;i<a;i++)
		{
			b[i][0]=b[i-1][0]+i;
			for(j=1;j<=a-i;j++)
			{
				b[i-1][j]=b[i-1][j-1]+j+i;
				printf(" %d",b[i-1][j]);
			}
			printf("\n%d",b[i][0]);			
		}
	}
	printf("\n");
}
为啥编译错哦?
Zahl 5年前 回复TA
#include <stdio.h>
#include <stdlib.h>
int main()
{

	int num;
	int sum1 = 1;
	int sum2 = 0;
	scanf("%d", &num);
	
	for (int i = 0; i < num;i++)
	{
		sum1 = sum1+i;
		printf("%d ", sum1);
		sum2 = sum1;
		for (int j = i+2; j <= num; j++)
		{
			sum2 = sum2 + j;
			printf("%d ", sum2);

		}
		printf("\n");
	}
	system("pause");
}
CC 5年前 回复TA
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main()
{
    int m;
    scanf("%d",&m);
    int a[m][m];
    int i = 0,j = m-1;
    int n = (m+1)*m/2;
    while(n!=0)
    {
        a[i][j] = n;
        n--;
        if(j==0)
        {
            j = i-1;
            i = 0;
        }
        else
        {
            i = i+1;
            j = j-1;
        }
    }
    for(int i = 0;i<m;i++)
    {
        for(int j = 0;j<m-i;j++)
        {
            if(j==0)
                printf("%d",a[i][j]);
            else
                printf(" %d",a[i][
月下萤火 5年前 回复TA
@月下萤火 @jm6110 可还是通过了