Java Web学习—编程1:数字三角形+三种解题思路+详细规律

问题如下图:
1
3 2
4 5 6
10 9 8 7
……
输入
3 2
输出
5
个人分析:
这个题,我采用了三种方式来求,第一种通过打表,先将每个数放入数组当中,然后输出该行该列的值就可以了,但是与题目意思不太符合,因为如果不考虑行数的话,数组的是有界的!

第二种就是通过公式求出按照顺序的每行的那个最后一个最大值(不是S型规划了~~~)
比如第一行是1 ,第二行就是3 第三行就是6 第四行就是10…

每行第一个值公式是
(x*(x+1))/2 因为这里对应于输入从第一行第一列开始,如果是从0开始的话,公式:(x*(x-1))/2

第三种和第二种比较类似,只是通过两个for循环求出了每行的那个最后一个最大值(同第二种)

对于第二种和第三种的规律:

代码里的num1代表行数 num2代表列数 res代表结果

1
3 2
4 5 6
10 9 8 7
如果是偶数行的话:
结果=结果-(列数-1)
比如第二行,我要求2行1列的数
res起初=3 然后res=3-(1-1)=3;
如果是奇数行的话:
结果=结果-(行数-列数)
比如第三行,我要求3行2列的数
res起初=6 然后res=6-(3-2)=5;
具体详细代码如下:

	//行数从1开始数,如果是偶数行
	if(num1%2==0)
	{
		res-=num2-1;
	}
	//如果是奇数行
	else
	{
		res-=(num1-num2);
	}

第一种代码比较长的打表法:

import java.util.Scanner;

public class Demo01 {

	public static void main(String[] args) {
		int a[][]=new int [10000][10000];
		int res=1;
		Scanner sc=new Scanner(System.in);
		for(int i=1;i<=1000;i++)
		{
			if(i%2==1)
			{
				for(int j=1;j<=i;j++)
				{
					a[i][j]=res;
					res++;
				}
			}
			else
			{
				for(int j=i;j>=1;j--)
				{
					a[i][j]=res;
					res++;
				}
			}
		}
		int num1=sc.nextInt();
		int num2=sc.nextInt();
		System.out.print(a[num1][num2]+" ");
		

	}

}

第二种公式法求出每行的那个最大值,然后通过规律求出那列的值:

import java.util.Scanner;

public class Demo02 {

	public static void main(String[] args) {
		int  res=0;
		Scanner sc=new Scanner(System.in);
		int num1=sc.nextInt();
		int num2=sc.nextInt();
		res=(num1*(num1+1))/2;
		//行数从1开始数,如果是偶数行
		if(num1%2==0)
		{
			res-=num2-1;
		}
		//如果是奇数行
		else
		{
			res-=(num1-num2);
		}
		System.out.println(res);
		
	}

}

第三种通过找规律求出结果法:

import java.util.Scanner;

public class Demo03 {

	public static void main(String[] args) {
		int  res=0;
		Scanner sc=new Scanner(System.in);
		
		int num1=sc.nextInt();
		int num2=sc.nextInt();
		for(int i=1;i<=num1;i++)
		{
			for(int j=1;j<=i;j++)
			{
				res++;
			}
		}
		//行数从1开始数,如果是偶数行
		if(num1%2==0)
		{
			res-=num2-1;
		}
		//如果是奇数行
		else
		{
			res-=(num1-num2);
		}
		System.out.println(res);
	}
}

学如逆水行舟,不进则退

你可能感兴趣的:(Web技术)