【精选】JAVA入门算法题(一)

版权声明:很高兴认识你,我叫邵龙飞 原创文章,转载请注明 https://blog.csdn.net/qq_37482202/article/details/84707055

跌倒了,一定要爬起来。不爬起来,别人会看不起你,你也会失去机会。

1.题目:打印出杨辉三角形(要求打印出10行)

什么是杨辉三角呢?下面这个就是

杨辉三角最大的特性就是每个数字都是该数字肩上的两个数字之和,这道题经常在学习二维数组和循环控制中出现

我们可以假设吧这些数存在一个二维数组中,那么ints[i][j]=ints[i-1][j-1]+ints[i-1][j];我们可以很容易使用for循环加二维数组实现它

int[][] ints=new int[10][10];
        for (int i=0;i<10;i++){
            for (int j=0;j<=i;j++){
                if (i-1<0||j-1<0){
                    ints[i][j]=1;
                }else {
                    ints[i][j]=ints[i-1][j-1]+ints[i-1][j];
                }
                System.out.print(ints[i][j]+" ");
            }
            System.out.println();
        }

2.题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

对于这种一开始看可能没思路的题你可以采取先把前几个数字写出来,然后研究其规律,最后编程实现

那么我们把前10个月的数字写出来:1 1 2 3 4 8  13 21 34 55

通过观察发现这个数列的规律为每个数字为前两位数字之和,这不就是斐波那契数列吗?(高中讲的)

那我们便可以定义三个变量分别表示一月份的兔子、二月份的兔子、三月份的兔子,使用for循环不断输出每个月的兔子数量

另外我们还要定义一个变量用于交换值

每次循环时,先使用额外变量保存一月份的兔子数,该月的一月兔子数等于二月份兔子长到三月份生的一窝加上原来已经就是三月份的兔子生的一窝

三月份的兔子数等于二月份的兔子长到三月份了加上原来就是三月份的兔子

二月份的兔子等于上个月一月份的兔子

总数就是三个变量之和

int count=1;
        int oneMonth=1;
        int twoMonth=0;
        int threeMonth=0;
        int cache=0;
        for (int i=0;i<30;i++){
            System.out.println("月份:"+(i+1)+" 总数:"+count+" 一月:"+oneMonth+" 二月:"+twoMonth+" 三月:"+threeMonth);
            cache=oneMonth;
            oneMonth=twoMonth+threeMonth;
            threeMonth=twoMonth+threeMonth;
            twoMonth=cache;
            count=oneMonth+twoMonth+threeMonth;
        }

那还有一种思路就是把两个月的兔子看成一轮,每个月的数量等于前两个月份之和,一次算出来两个月分别的兔子数量

long s1,s2;// 定义这个月和下个月兔子的数量
        s1 = 1;  //第一个月为1对
        s2 = 1;  //第二个月为1对
        int i=1;  //定义一个控制变量
        int m=30;  // 月份数
        //while循环
        while(true){
            //第一个月和第二个月兔子的数量都为1对
            if(i==1||i==2){
                System.out.println(i+" month: "+s1);
                i++; // 控制变量 i 加1
            }
            // i 大于3并且小于我们需要查看的月份
            else if(i<m){
                s1 = s1+s2;
                s2 = s1+s2;
                System.out.println(i+" month: "+s1);
                i++;//月份加1
                System.out.println(i+ " month: "+s2);
                i++; //月份加1
            }else{
                break;//不符合条件就退出
            }

        }

我们还可以利用java自带的数据结构来完成这件事

LinkedList<Integer> integerList=new LinkedList<>();
        for (int i=0;i<30;i++){
            if (i<2){
                integerList.add(1);
                System.out.println("月份:"+(i+1)+" 兔子总数:"+integerList.getLast());
            }else {
                integerList.add(integerList.getLast()+integerList.get(integerList.size()-2));
                System.out.println("月份:"+(i+1)+" 兔子总数:"+integerList.getLast());
            }
        }

3.题目:判断101-200之间有多少个素数,并输出所有素数。

判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

遇到这种题就直接暴力for循环,定义个boolen判断是不是素数

for (int i=101;i<=200;i++){
            boolean isPrimeNumber=true;
            for (int j=2;j<i;j++){
                if (i%j==0){
                    isPrimeNumber=false;
                    break;
                }
            }
            if (isPrimeNumber){
                System.out.println(i);
            }
        }

有一种巧妙的办法可以不用定义boolen变量作为标志,我们只需要把内层玄幻的j定义在外层,这样如果i等于j说明循环走完了,就可以判断它是一个素数

 int j=0;
        for (int i=101;i<=200;i++){
            for (j=2;j<i;j++){
                if (i%j==0){
                    break;
                }
            }
            if (j==i){
                System.out.println(j);
            }
        }

在这些优化之后我们还可以借用数学的帮助,凡是一个数开方后的数的素数都是原来那个数的素数,至于最后的加一是因为循环是从2开始的,1是任何数的因数

 int j=0;
        int k=0;
        for (int i=101;i<=200;i++){
            k=(int)sqrt(i+1);
            for (j=2;j<=k;j++){
                if (i%j==0){
                    break;
                }
            }
            if (j==k+1){
                System.out.println(i);
            }
        }

4.题目:将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5。

其实这道题就相当于找素数的升级版,找到给定范围内几个素数的想乘结果等于它本身

做这种题我们很容易想到递归,不断找素数,不断缩小范围

static List<Integer> integerList=new ArrayList<>();
private static void Method1() {
        Scanner scanner=new Scanner(System.in);
        int number=scanner.nextInt();
        getPrimeFactor(number);
        System.out.println(integerList);
    }

    private static void getPrimeFactor(int number) {
        for (int i=2;i<=number;i++){
            if (number%i==0){
                integerList.add(i);
                getPrimeFactor(number/i);
                break;
            }
        }
    }

我们可以将其转换成while循环

 Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k=2;
        System.out.print(n+"=");//输出第一步格式
        while(k<=n){//初值k为2,n为输入的数字,在程序执行的过程中k渐渐变大(k++),n渐渐变小(n/k)
            if(k==n){//当n和k相等的时候,就直接输出n的值(此时输出k也行,因为n==k)
                System.out.println(n);
                break;
            } else if(n%k==0){
                System.out.print(k+"*");//如果n <> k,但n能被k整除,则应打印出k的值
                n = n/k;//n除以k的商,作为新的正整数你n
            }else{
                k++;//如果n不能被k整除,则用k+1作为k的值
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_37482202/article/details/84707055