要求编写算法输出下列图形:
1
5 2
8 6 3
10 9 7 4
…………………………………………………………
有两个方法来进行表示,但是原理是一样的
由上面图形可知,左下角的数是图形中最大的数且数值为主对角线(即每行的最右边的数)之和
方法一:
由求和公式得出Kmax=m(m+1)/2
#include<stdio.h>
#define N 100
int main(){
int m;
int cnt=0;
scanf("%d",&m);//打印出一个m*m的矩阵
int str[N][N]={0};//创建一个N*N的二维数组并将初值赋0
//该循环将二维数组填写好
for(int i=0,j=0,k=1;k<=m*(m+1)/2;k++){
str[i++][j++]=k;//把二维数组最外层的1~m填满
if(i>=m){//排完最外层以后列数归零,开始计算第二层~第m层
i=++cnt;
j=0;
}
}
//遍历二维数组,将各个数值打印出来
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
if(str[i][j]){//当数值非0时打印
printf("%-5d ",str[i][j]);//我定义的是左对齐,如果题目中有规定请修改此信息
}
else
{//当数值为0时换行
printf("\n");
break;
}
}
}
}
方法二:
#include<stdio.h>
#define N 100
int main(){
int m;
int n=1;
scanf("%d",&m);//打印出一个m*m的矩阵
int str[N][N]={0};//创建一个N*N的二维数组并将初值赋0
//该循环将二维数组填写好
for(int i=0;i<m;i++){//从最外层开始将二维数组对角线式填满
for(int j=0;j<m-i;j++){//每内循环一次,要赋值的最外层单位数就会减一
str[i+j][j]=n++;
}
}
//遍历二维数组,将各个数值打印出来
for(int i=0;i<m;i++){
for(int j=0;j<=i;j++){
printf("%-5d",str[i][j]);//当数值非0时打印
}
printf("\n");//从上到下每打印一行的数据,就换行
}
}
由于最近在苦练Java,就再用Java敲一遍(卑微)
注释请参见上面C的代码,算法是一样的
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int m = Integer.parseInt(bf.readLine());
int n = 1;
int[][] str = new int[100][100];
for (int i = 0; i < m; i++) {
for (int j = 0; j < m - i; j++) {
str[i + j][j] = n++;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j <= i; j++) {
System.out.printf("%-5d", str[i][j]);
}
System.out.println();
}
}
}