在一行上输入一个整数
代表矩阵的大小。
输出一个
行
列的上三角蛇形矩阵。
4
1 3 6 10 2 5 9 4 8 7
第一步,
,将
;
第二步,
,将
、
;
第三步,
,将
、
、
;
第四步,
,将
、
、
、
。
import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[][] arr = set(n); //System.out.println(n); StringBuilder sb = new StringBuilder(); for(int i=0; i<n; i++){ for(int j=0; j<n-i; j++){ sb.append(arr[i][j]).append(" "); } sb.append("\r\n"); } System.out.println(sb.toString()); br.close(); } public static int[][] set(int n){ int[][] arr = new int[n][n]; int y=0, m=0;//y为横坐标,m表示坐标上的值 for(int i=0; i<n; i++){//i为斜着的行 y = i; while(y>=0){ arr[y][i-y] = ++m; y--; } } return arr; } }2.硬方法,线下计算得出坐标公式,求公式比较难
import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); int number = 0; for(int x=1; x<=n; x++){//横坐标x for(int y=1; y<=n-x+1; y++){//纵坐标y //线下计算得出坐标公式 number = (x*x + y*y -y -3*x)/2 + x*y + 1; sb.append(number).append(" "); } sb.append("\r\n"); } System.out.println(sb.toString()); br.close(); } }3.定义一个横向步长(x+y+1)和一个纵向步长(x),每一行计算后接着计算下一行
import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); int base = 1;//每一行的初始值 for(int x=0; x<n; x++){//横坐标x,从0开始 base += x;//初始值累积 int number = base;//坐标值 for(int y=0; y<n-x; y++){//纵坐标y,从0开始 if(y>0){ number += x+y+1;//x+y+1为横坐标步长 } sb.append(number).append(" "); } sb.append("\r\n"); } System.out.println(sb.toString()); br.close(); } }
num = int(input()) #dic = {} first = 1 for i in range(0,num): li = [] first = first + i li.append(str(first)) # print(first, end = " ") val = first for j in range(i+2, num+1): val = val + j li.append(str(val)) # print(val, end = " ") # print(li) print(" ".join(li))
#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; }
#include <bits/stdc++.h> using namespace std; int main(){ /* 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 例如,当输入5时,应该输出的三角形为: 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 */ /* N = 5 第一行,依次+2 +3 +4 +5 第二行,依次+3 +4 +5 第三行,依次+4 +5 第四行,+5 第五行,第四行最后一个减1 每排开头的第一个 等于 上一排第二个减一 */ //可以创建一个二维数组,i为行数,每行第二个数为 第一个数+i+1, int inputNum; while(cin >> inputNum){ vector<vector<int>> vec; vec.resize(inputNum);//初始化二维数组的行数 int i = 0 , n = inputNum; int num = 1; while(n > 0){ for(int j = i + 1; j <= inputNum; j++){//插入一行数组 vec[i].push_back(num); num = num + j + 1; } i++;//控制数组插入行数 n--; num = vec[i - 1][1] - 1; } for(int f = 0; f < inputNum; f++){ for(int t = 0; t < vec[f].size(); t++){ cout << vec[f][t] << " "; } cout << endl; } } return 0; }
#include<iostream> #include<vector> using namespace std; int main(){ int n; while(cin>>n){ vector<vector<int>>snake(n,vector<int>(n,0)); //初始化第一行 for(int i=0;i<n;i++){ snake[0][i]=(i+1)*(i+2)/2; } //递推 for(int i=1;i<n;i++){ for(int j=0;j<n-i;j++){ snake[i][j]=snake[i-1][j+1]-1; } } //输出 for(int i=0;i<n;i++){ for(int j=0;j<n-i;j++){ cout<<snake[i][j]<<" "; } cout<<endl; } } return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNextInt()){ int n = in.nextInt(), a = 0, k = 1; for(int i=1;i<=n;i++){ k += i-1; a = k; System.out.print(a+" "); for(int j=1,k2=1+i;j<=n-i;j++){ // 注意:j<=n-i是使每行输出的个数递减,k2=1+i是每行的初始都会加1 a += (k2++); System.out.print(a+" "); } System.out.println(); } } } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int lines = 0; while (scanner.hasNext()){ lines = scanner.nextInt(); printSnakeNum(lines); } } public static void printSnakeNum(int lines){ int head = 1; // 从 1 开始 for (int i = 0; i < lines; i++){ head += i; // 首列元素之间相差 1 2 3 4.... 以此类推 System.out.print(head + " "); int body = head; for (int j = i + 2; j <= lines; j++){ // 第一行元素从2相差开始递增,第二行从3开始递增,每一行都比上一行的差值增1 body += j; System.out.print(body + " "); } System.out.println(); } } }
#include <stdio.h> #include <stdlib.h> #define N 100 int mat[N][N]; int main(void) { int n, i, j, k, num; while (scanf("%d", &n) != EOF) { num = 1; for (k = 0; k < n; ++k) for (i = k, j = 0; i >= 0; --i, ++j) mat[i][j] = num++; for (i = 0; i < n; ++i) { for (j = 0; j < n - i; ++j) printf("%d ", *(*(mat + i) + j)); putchar('\n'); } } return 0; }
#include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> #include<vector> using namespace std; int main() { int n; while(cin>>n) { vector<vector<int>> matrix; int id=1; n=(1+n)*n/2; //输出的数字总数 while(id<=n) { matrix.push_back(vector<int>(1,id++)); int div=matrix.size(); div-=1; while(--div>=0) { matrix[div].push_back(id++); } } for(int i=0;i<matrix.size();++i) { for(int x:matrix[i]) { cout<<x<<" "; } cout<<endl; } } return 0; }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while((line = br.readLine()) != null){ int N = Integer.parseInt(line.trim()); int rowBeginNum = 1; // 第一行的第一个数 int stepRow = 1; // 每行第一个数的增幅 for(int i = 1; i <= N; i++){ int row = rowBeginNum; // 每行的第一个数 int n = N - i + 1; // 每行的数个数 StringBuilder sb = new StringBuilder(); int stepCol = i + 1; // 每列的初始增幅 int count = 0; while(count++ < n){ sb.append(row + " "); row += stepCol; // 更新本行的下一个数 stepCol ++; // 更新每列数的增幅 } rowBeginNum += stepRow; // 更新下一行的第一个数 stepRow ++; // 更新每行第一个数的增幅 System.out.println(sb.toString().trim()); } } } }
//试了下竟然通过了!!! #include <iostream> using namespace std; int main() { int n; while(cin >> n) { int a[100][100] = {0}; int b[100] = {0}; int t1 = 1; for(int i = 0; i < n; i++) { for(int j = i; j >= 0; j--) { a[j][b[j]] = t1; b[j]++; t1++; } } for(int i = 0; i < n; i++) { for(int j = 0; j < b[i]; j++) { cout << a[i][j] << " "; } cout << endl; } } }
while True: try: n=int(input()) lst=[] for i in range(n): lst.append([ii for ii in range(int(i*(i+1)/2+1),int((i+1)*(i+2)/2+1))]) m=0 for m in range(n): for i in range(m,n): print(lst[i][-m-1],end=' ') print('') except: break
#include <stdio.h> int main() { int n; int func(int m,int n); while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { for(int j=0;i+j<n;j++) { printf("%d ",func(i,j)); } printf("\n"); } } return 0; } int func(int m,int n) { if(m==0&&n==0)return 1; else if(m!=0&&n==0)return func(m-1,n)+m; else return func(m,n-1)+m+n+1; }递归居然要5ms。
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); while (scanner.hasNextInt()){ Main a = new Main(); int n = scanner.nextInt(); String result = ""; int start = 1; for (int i = 0; i < n; i++){ result += String.valueOf(start); int current = start; int count = 2+i; while (count <= n){ result += " " + String.valueOf(current+count); current = current+count; count += 1; } result += "\n"; start += 1+i; } System.out.print(result); } } }