0
点赞
收藏
分享

微信扫一扫

JAVA经典算法50题(1)【面试+工作】

_阿瑶 2022-04-06 阅读 65


JAVA经典算法50题(1)【面试+工作】

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

1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....

具体分析如下:

f(1) = 1(第1个月有一对兔子)
f(2) = 1(第2个月还是一对兔子)
f(3) = 2(原来有一对兔子,第3个开始,每个月生一对兔子)
f(4) = 3(原来有两对兔子,有一对可以生育)
f(5) = 5(原来有3对兔子,第3个月出生的那对兔子也可以生育了,那么现在有两对兔子可以生育)
f(6) = 8(原来有5对兔子,第4个月出生的那对兔子也可以生育了,那么现在有3对兔子可以生育)
..............
由以上可以看出,第n个月兔子的对数为
f(n) = f(n - 1) + f(n - 2);
f(n-1)是上个月的兔子数量,是原来有的。
f(n-2)是可以生育的兔子数,即多出来的数量。第n-2个月开始后的第3个月是第n个月,此时第n-2个月时的兔子都可以生育了。

public class Demo01 {
    public static void main(String args[]) {
        for (int i = 1; i <= 20; i++)
            System.out.println(f(i));
    }
    public static int f(int x) {
        if (x == 1||x == 2)
            return 1;
        else
            return f(x - 1) + f(x - 2);
    }
}

public class Demo01 {
    public static void main(String args[]) {
        math mymath = new math();
        for (int i = 1; i <= 20; i++)
            System.out.println(mymath.f(i));
    }
}
class math {
    public int f(int x) {
        if (x == 1||x == 2)
            return 1;
        else
            return f(x - 1) + f(x - 2);
    }
}


【程序2】   题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

public class Demo02{

    public static void main(String[] args){

        for(int i=2;i<=200;i++){

            boolean flag=true;

            for(int j=2;j<i;j++){

                if(i%j==0){

                    flag=false;

                    break;

                }

            }

            if(flag==true){

                System.out.print(" "+i);

            }

        }

    }

}


【程序3】   题目:打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

public class Demo03 {

    public static void main(String args[]) {

        math mymath = new math();

        for (int i = 100; i <= 999; i++)

            if (mymath.shuixianhua(i) == true)

                System.out.println(i);

    }

}

class math {

    public boolean shuixianhua(int x) {

        int i = 0, j = 0, k = 0;

        i = x/100;

        j = (x%100)/10;

        k = x%10;

        if (x == i*i*i + j*j*j + k*k*k)

            return true;

        else

            return false;

    }

}


【程序4】   题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 
​1.程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成: 

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你,重复执行第一步。

(3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。

import java.util.Scanner;

public class Demo04 {

    public Demo04() {

        super();

    }

    public void fenjie(int n) {

        for (int i = 2; i <= n; i++) {

            if (n % i == 0) {

                System.out.print(i);

                if(n!=i){

                    System.out.print("*");

                }

                fenjie(n/i);

            }

        }

        System.exit(0); //退出程序

    }

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        System.out.println("请输入N的值:");

        int N = in.nextInt();

        System.out.print( "分解质因数:" + N +"=");

        new Demo04().fenjie(N);

    }

}


【程序5】   题目:利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
​1.程序分析:(a>b)?a:b这是条件运算符的基本例子。

import java.util.Scanner;

public class Demo05 {

    public static void main(String[] args) {

        System.out.println("请输入N的值:");

        Scanner in = new Scanner(System.in);

        int N = in.nextInt();

        System.out.println(N >= 90 ?"A": (N >= 60 ? "B":"C"));

    }

}


【程序6】   题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
​1.程序分析:利用辗除法。

import java.util.Scanner;

public class Demo06 {

    public static void main(String[] args){

        int a,b,m,n;

        Scanner in=new Scanner(System.in);

        System.out.println("请输入一个正整数:");

        a=in.nextInt();

        System.out.println("再输入一个正整数:");

        b=in.nextInt();

        commonDivisor use=new commonDivisor();

        m=use.commonDivisor(a,b);

        n=a*b/m;

        System.out.println("最大公约数:"+m);

        System.out.println("最小公倍数:"+n); 

    }

}

class commonDivisor{

    public int commonDivisor(int x,int y){

        if(x<y){

            int t=x;

            x=y;

            y=t;

        }

        while(y!=0){

            if(x==y)return x;

            else{

                int k=x%y;

                x=y;

                y=k;

            }

        }

        return x;

    }

}


【程序7】   题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
​1.程序分析:利用for循环语句,if条件语句。

import java.util.Scanner;


public class Demo07 {

    public static void main(String[] args){

        System.out.println("请输入一个字符串;");

        Scanner in=new Scanner(System.in);

        String str=in.nextLine();

        char[] ch=str.toCharArray();

        count use=new count();

        use.count(ch);

    }

}

class count{

    int digital,character,blank,other;

    public void count(char[] arr){

        for(int i=0;i<arr.length;i++){

            if(arr[i]>='0'&&arr[i]<='9'){

                digital++;

            }else if((arr[i]>='a'&&arr[i]<='z')||(arr[i]>='A'&&arr[i]<='Z')){

                character++;

            }else if(arr[i]==' '){

                blank++;

            }else{

                other++;

            }

        }

        System.out.println("数字个数:"+digital);

        System.out.println("英文字母个数:"+character);

        System.out.println("空格个数:"+blank);

        System.out.println("其他字符个数:"+other);

    }

}


【程序8】   题目:求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制。
​1.程序分析:关键是计算出每一项的值。

import java.util.Scanner;

public class Demo08 {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        System.out.println(请输入a的值);

        int a = in.nextInt();

        System.out.println(请输入n个数);

        int n = in.nextInt();

        int s = 0,t=0;

        for (int i = 1; i <= n; i++) {

            t += a;

            a = a*10;

            s += t;

        }

        System.out.println(s);

    }

}


【程序9】   题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数。
​public class Demo09 {

    public static void main(String[] args) {

        int s;

        for (int i = 1; i <= 1000; i++) {

            s = 0;

            for (int j = 1; j < i; j++)

                if (i % j == 0)

                    s = s + j;

            if (s == i)

                System.out.print(i + " " );

        }

        System.out.println();

    }

}

public class Demo09{

    public static void main(String[] args) {

        int i,j,sum;          

        for(i=1;i<1000;i++)  

        {

            sum = 0;          

            for(j=1;j<=i/2;j++)   

            {

                if(i%j==0)         

                {

                    sum+=j;        

                }

            }

            if(sum==i)            

            {

                System.out.print(i+" its factors are:   ");       

                for(j=1;j<=i/2;j++)                          

                {

                    if(i%j==0)                                  

                        System.out.print(j+", ");

                }

                System.out.println();

            }

        }

    }

}


【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
​public class Demo10 {

    public static void main(String[] args) {

        double s = 0;

        double h = 100;

        for (int i = 1; i <= 10; i++) {

            s += h;

            h = h/2;

            s += h;

        }

        System.out.println("经过路程:"+s);

        System.out.println("反弹高度:"+h);

    }

}


JAVA经典算法50题(1)【面试+工作】_i++

JAVA经典算法50题(1)【面试+工作】_程序分析_02JAVA经典算法50题(1)【面试+工作】_程序分析_03JAVA经典算法50题(1)【面试+工作】_i++_04JAVA经典算法50题(1)【面试+工作】_java_05



举报

相关推荐

0 条评论