JAVA经典算法40题

来源:互联网 发布:c语言编译器安卓版 编辑:程序博客网 时间:2024/06/08 04:06

刷题开始!

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

总结规律: 1 1 2 3 5 8 13 —
其实就是一个数列,前一项 + 后一项 = 现在这一项,用递归最快,最简单

public class Demo01 {    public static void main(String[] args) {        for(int i = 1; i < 12; i++) {            System.out.print("第" + i + "月" + "有  " + tuzi(i) + "只\n");        }    }    public static int tuzi(int month) {        if (month == 1 || month == 2) {            return 1;        }         return tuzi(month-1) + tuzi(month-2);    }}

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

public class Demo2 {    public static void main(String[] args) {        for (int i = 101; i < 200; i++) {            if (isSuShu(i)) {                System.out.print(i + " ");            }        }    }    public static boolean isSuShu(int x) {        boolean flag = false;        for (int i = 2; i <= Math.sqrt(x); i++) {            if(x%i==0) {                flag =  false;                break;            }            flag =  true;        }        return flag;    }}

注意一下,在Math.sqrt中,要<=, 不然会出问题

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

public class Demo3 {    public static void main(String[] args) {        for (int i = 100; i < 1000; i++) {            int b = i /100;            int s = i/10%10;            int g = i%10;            if (i == (b*b*b + s*s*s + g*g*g)) {                System.out.print( i + " ");            }        }    }}

主要是对三位数进行拆分位数

题目4:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

public class Demo4 {    public static void main(String[] args) {        int value  =  new Scanner(System.in).nextInt();        int flag = 0;        for (int i = 2; i <= value; i++) {            while(value % i ==0) {                flag++;                if (flag == 1) {                    System.out.print(value + "=" + i);                }else {                    System.out.print("*" + i);                }                value = value/i;            }        }    }   }

题目5:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

public class Demo5 {    public static void main(String[] args) {        System.out.println("请输入学成成绩:");        int value = new Scanner(System.in).nextInt();        String str = "";        if (value >= 90) {            str = "A";        } else if (value >= 60 && value < 89) {            str = "B";        } else {            str = "C";        }        System.out.println("成绩等级为: " + str);    }}

题目6:输入两个正整数m和n,求其最大公约数和最小公倍数。

public class Demo6 {    public static void main(String[] args) {        System.out.println("请输入十个数字: ");        Scanner input = new Scanner(System.in);        int m = input.nextInt();        int n = input.nextInt();        int t = n*m;        if(n > m) {            int temp = n;            n = m;            m = temp;        }        int temp;        while( m%n != 0) {            temp = m%n;            m = n;            n = temp;        }        System.out.println("最大公约数" + n   + " 最小公倍数" + t/n );    }}

个人觉得这题,有点迷糊,主要是概念不清
点击一下 : 概念

题目7:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
public class Demo7 {    public static void main(String[] args) {        System.out.println("请输入一行字符: ");        String data = new Scanner(System.in).nextLine();        int y = 0;        int s = 0;        int k = 0;        int q = 0;        char[] cs = data.toCharArray();        for (int i = 0; i < cs.length; i++) {            if (cs[i] >='A' && cs[i] <='z') {                y++;            } else if (cs[i] >= '0' && cs[i] <= '9') {                s++;            } else if (cs[i] == ' ') {                k++;            } else {                q++;            }        }        System.out.println("字母个数: " + y);        System.out.println("空格个数: " + k);        System.out.println("数字个数: " + s);        System.out.println("其它个数: " + q);    }}

很多人,用正则表达式,但我觉得我这个是最简单的,直接利用字符串转换成字节数组,再一个一个判断

题目8:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

public class Demo8 {    public static void main(String[] args) {        System.out.println("请输入多少项,由你决定 : ");        int n = new Scanner(System.in).nextInt();        long sum = 0;        long s = 0;        for (int i = 0; i < n; i++) {            sum = sum * 10 + n;            s = s + sum;        }        System.out.println("数值为: "  + s);    }}

主要是利用x不断的*10 倍再加上上一次的数,这个是小技巧

题目9:一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数。
public class Demo9 {    public static void main(String[] args) {        for (int i = 1; i < 1000; i++) {            if (i == yinZi(i)) {                System.out.println(i);            }        }    }    public static int yinZi(int d) {        int sum = 0;        for (int i = 1; i < d; i++) {            if (d % i == 0) {                sum += i;            }        }        return sum;    }}
题目10:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
public class Demo10 {    public static void main(String[] args) {        double last = 100;        double sum = 0;        for (int i = 0; i < 10; i++) {            sum = sum + last;            last = last/2;        }        System.out.println("共经过: " + sum + "米");        System.out.println("第10次反弹 " + last + "米");    }}

关键是题目看懂,要注意用double, 因为有小数,不然结果最后为0了,别问我怎么知道

题目11:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

public class Demo11 {    public static void main(String[] args) {        for (int i = 1 ; i <= 4; i++) {            for (int j = 1; j <= 4; j++) {                for (int k = 1; k <= 4; k++) {                    if (i!=j && i!=k &&j !=k ) {                        System.out.println(i +"" + j + "" + k);                    }                }            }        }    }}

这是水仙花典型题型,不说了,太简单了

题目12:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润,求应发放奖金总数?

public class Demo12 {    public static void main(String[] args) {        System.out.println("请输入月利润: ");        int money = new Scanner(System.in).nextInt();        double sum = 0;        if (money <= 10) {            sum = sum * 0.1;         } else if (money > 10 && money <= 20) {            sum = 10 * 0.1 + (money - 10) * 0.075;        } else if (money > 20 && money <= 40) {            sum = 10 * 0.1 + 10 * 0.075 + (money - 20) * 0.05;        } else if (money > 40 && money <= 60) {            sum = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (money - 40) * 0.03;        } else if(money > 60 && money <= 100) {            sum = 10 * 0.1 + 10 * 0.075 + 20 *0.05 + 40 * 0.03 + (money - 60) * 0.015;        } else if (money > 100) {            sum = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 40 * 0.03 + 60 * 0.015 + (money - 100) * 0.01;        }        System.out.println("sum " + sum + "万");    }}

主要是数学思维,要小心仔细

题目13:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
public class Demo13 {    public static void main(String[] args) {        long a;        long b;        for (int i = 0; i < 100000; i++) {            a = (long)Math.sqrt(i+100);            b = (long)Math.sqrt(i+100+168);            if ( (a*a == (i+100)) && (b*b == (i + 100 + 168) )) {                System.out.println(i);            }        }    }}
题目14:输入某年某月某日,判断这一天是这一年的第几天?
public class Demo14 {    public static void main(String[] args) {        System.out.println("输入年 月日 : ");        Scanner input = new Scanner(System.in);        int year = input.nextInt();        int month = input.nextInt();        int day = input.nextInt();        int sum = 0;        int te = 0;        if (isR(year)) {            te = 29;        } else {            te = 28;        }        switch (month) {        case 2:            sum = 31;            break;        case 3:            sum = 31 + te;            break;        case 4:            sum = 31 + te + 31;            break;        case 5:            sum = 31 + te + 31 + 30;            break;        case 6:            sum = 31 + te + 31 + 30 + 31;            break;        case 7:            sum = 31 + te + 31 + 30 + 31 + 30;            break;        case 8:            sum = 31 + te + 31 + 30 + 31 + 30 + 31;            break;        case 9:            sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31;            break;        case 10:            sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31 + 30;            break;        case 11:            sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;            break;        case 12:            sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;            break;        default:        }        System.out.println("第" + (sum + day) +"天");    }    public static boolean isR(int year) {        boolean flag = false;        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {            flag = true;        }        return flag;    }}

原谅我的笨方法

题目15:输入三个整数x,y,z,请把这三个数由小到大输出。

public class Demo15 {    public static void main(String[] args) {        System.out.println("请输入3个数字: ");        Scanner input = new Scanner(System.in);        int a = input.nextInt();        int b = input.nextInt();        int c = input.nextInt();        System.out.println("三个数字为: " + a + " " + b + " "  +c);        if(a > b) {            a = a^b;            b = a^b;            a = a^b;        }        if(a > c) {            a = a^c;            c = a^c;            a = a^c;        }        if (b > c) {            b = b^c;            c = b^c;            b = b^c;        }        System.out.println("之后的数值: " + a + " " + b + " " + c);    }}

呜呜,好累,大家让我休息下,代码已发到我的github,大家有需要,可以点击下载
点击基础试题下载

0 0
原创粉丝点击