这种题目往往都是找出各个元素之间的规律。
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; }
0.0分
64 人评分
#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; } }
递归法,不过时间复杂度还是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); } } } }
#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; } }
#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; } }
#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; }
求大佬解惑,运行不出来,,,,, #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"); } }
不用这么麻烦~ #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; }
阳春 2021-03-16 17:06:27 |
太厉害了!大佬
#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; }
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:661 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:466 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:534 |
1051(奇了怪了)浏览:645 |
Tom数 (C语言代码)浏览:525 |
字符串的输入输出处理 (C语言代码)浏览:984 |
整除问题 (C语言代码)浏览:518 |
排序算法(选择,插入,冒泡)浏览:774 |
小O的图案 (C语言代码)浏览:912 |
字符删除 (C语言代码)浏览:715 |
TCcjx 2021-04-05 15:07:15 |
请教一下,这个规律是怎么找到的?
JUNE 2021-04-10 21:42:19 |
不得不说下面这个规律真的强