等腰三角形
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
- 先用1,2,3,…的自然数拼一个足够长的串
- 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:
1
2 1
3 8
4 1
5 7
6 1
7 6
891011121314151
分析:
-------思路.通过规律可得:所填充的数字不大于 2*n+3。 创建二位数组 根据规律填充数组最后打印
import java.util.Scanner;
public class Main {
/*
标题:等腰三角形
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
1. 先用1,2,3,...的自然数拼一个足够长的串
2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:
1
2 1
3 8
4 1
5 7
6 1
7 6
891011121314151
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][]arr = new int[n][];//二维数组
int ii = 0;//变量代表二维数组下标
for (int i = n; i < n*2; i++) {
arr[ii++] = new int[i];//每一个二维数组 装一维数组
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j]=10;//填充数据两位数,因为填充的都是一位数的数据 用于最后打印
}
}
int a = 1;//数字123456~~
int bj = 1;//标记判断 加到当前数a 的第几位了(百:1, 十:2, 个:3)||(十:1, 个:2)
//斜着向左下
for (int j = 0; j < arr.length-1; j++) {
//判断当前a的数值为几位数(根据数据模要求 300 根据公式算的不大于300*2+3=603 最多三位数)
if(a<10){
arr[j][--n] = a++;//直接填充数据 a加1
}else if(a<100){//两位数
if(bj==1){
arr[j][--n] = a/10;//取十位 a不做变化
bj++;//标记改变为2
}else if(bj==2){
arr[j][--n] = a%10;//第二位取个位
a++;// a加1
bj=1;//标记改为1
}
}else{//三位数
if(bj==1){//取百位
arr[j][--n] = a/100;
bj++;
}else if(bj==2){//取十位
arr[j][--n] = a/10%10;
bj++;
}else{//取个位
arr[j][--n] = a%10;
a++;
bj=1;
}
}
}
//横着从左向右 同上理
for (int i = 0; i < arr[arr.length-1].length; i++) {
if(a<10){
arr[arr.length-1][i] = a++;
}else if(a<100){
if(bj==1){
arr[arr.length-1][i] = a/10;
bj++;
}else if(bj==2){
arr[arr.length-1][i] = a%10;
a++;
bj=1;
}
}else{
if(bj==1){
arr[arr.length-1][i] = a/100;
bj++;
}else if(bj==2){
arr[arr.length-1][i] = a/10%10;
bj++;
}else{
arr[arr.length-1][i] = a%10;
a++;
bj=1;
}
}
}
//斜着向左上 同上理
for (int j = arr.length-2; j >=1; j--) {
if(a<10){
arr[j][arr[j].length-1] = a++;
}else if(a<100){
if(bj==1){
arr[j][arr[j].length-1] = a/10;
bj++;
}else if(bj==2){
arr[j][arr[j].length-1] = a%10;
a++;
bj=1;
}
}else{
if(bj==1){
arr[j][arr[j].length-1] = a/100;
bj++;
}else if(bj==2){
arr[j][arr[j].length-1] = a/10%10;
bj++;
}else{
arr[j][arr[j].length-1] = a%10;
a++;
bj=1;
}
}
}
//打印结果:
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j]==10){
System.out.print(" ");
}else{
System.out.print(arr[i][j]);
}
}
System.out.println();
}
}
}
由于上面的方法对于数据位数的处理很麻烦下面做了一下优化~~~~
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
char[][]arr = new char[n][];//二维数组
int ii = 0;//变量代表二维数组下标
for (int i = n; i < n*2; i++) {
arr[ii++] = new char[i];//每一个二维数组 装一维数组
}
//设置默认值
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j]=' ';
}
}
//生成字符串(数字拼接)123456789101112~
String s = "";
for (int i = 1; i <=n*2+3; i++) {
s+=i;
}
//System.out.println(s);
int a = 0;//数字123456~~
//斜着向左下
for (int j = 0; j < arr.length-1; j++) {
arr[j][--n] = s.charAt(a++);//取一次 下标变量加1
}
//横着从左向右 同上理
for (int i = 0; i < arr[arr.length-1].length; i++) {
arr[arr.length-1][i] = s.charAt(a++);
}
//斜着向左上 同上理
for (int j = arr.length-2; j >=1; j--) {
arr[j][arr[j].length-1] = s.charAt(a++);
}
//打印结果:
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j]==' '){
System.out.print(" ");
}else{
System.out.print(arr[i][j]);
}
}
System.out.println();
}
}
}
总结:
如果一个算法很麻烦,那么不如去寻找一些简单的方法。当然是对于有精力和兴趣的人来言的。