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

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 条评论

新城已无旧少年 3年前 回复TA
#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;
}
JUNE 3年前 回复TA
@licg 不得不说下面这个规律真的强
TCcjx 3年前 回复TA
@licg 请教一下,这个规律是怎么找到的?
末日流光 3年前 回复TA
#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;
}
licg 3年前 回复TA
#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;
    }
}
软件二班谭豪 3年前 回复TA
递归法,不过时间复杂度还是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);
			}
		}
	}
}
阳春 3年前 回复TA
@Logan 太厉害了!大佬
CrazyZ 4年前 回复TA
#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;
	}
}
CrazyZ 4年前 回复TA
#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;
	}
}
杜昊峰 4年前 回复TA
@蕉下客 把 请输入行数  删掉