JAVA之经典算法一

3 篇文章 0 订阅

程序1:有一对兔子,从出生后第 3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21….

public class Demo1 {

    public static void main(String args[]) {
        math mymath = new math();
        for (int i = 1; i <= 20; i++)
            System.out.println(mymath.f(i));
    }

    static 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 Demo2 {

    public static void main(String args[]) {

    boolean flag = true;
    int primeNum = 0;
        for(int i = 101 ; i < 201 ; i++){
        flag = isPrime(i);

        if(flag == true){
            //是素数
            System.out.println("101-200之间的素数有:" + i);
            primeNum++;
        }
    }
        System.out.println("101-200之间的素数数量共有:"+primeNum);

}

    public static boolean isPrime(int x){
        boolean flag = true;

        for(int i = 2 ; i <= Math.sqrt(x) ; i++){
            if(x % i == 0){
                flag = false;   //不是素数
            }
        }

        return flag;
    }
}

程序3:打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

方法1:

public class Demo3 {
    public static void main(String args[]) {

        //方法一
        for (int num=100;num<1000;num++)
        {
            int gw=num%10;
            int sw=num/10%10;
            int bw=num/100%10;
            if (gw*gw*gw+sw*sw*sw+bw*bw*bw==num)
            {
                System.out.println(num);
            }
        }
    }
}

方法2:

public class Demo3 {
    public static void main(String args[]) {
        int n=0,x,y;
        for (int i=1; i<=9; i++) {
            for (int j=0; j<=9; j++) {
                for (int k=0; k<=9; k++) {
                    x=i*i*i+j*j*j+k*k*k;
                    y=i*100+j*10+k;
                    if (x==y) {
                        n++;
                        System.out.print(y+" ");
                    }
                }
            }
        }
        System.out.print("三位数的水仙花数一共有: "+n+" 个");
    }
}

程序4:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

public class Demo4 {

    public static void main(String[] args) {
        System.out.println("请输人数n:");
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        boolean[] arr = new boolean[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = true; //下标为TRUE时说明还在圈里
        }
        int leftCount = n;
        int countNum = 0;
        int index = 0;
        while (leftCount > 1) {
            if (arr[index] == true) { //当在圈里时
                countNum++;  //报数递加
                if (countNum == 3) { //报数为3时
                    countNum = 0; //从零开始继续报数
                    arr[index] = false; //此人退出圈子
                    leftCount--; //剩余人数减一
                }
            }
            index++; //每报一次数,下标加一
            if (index == n) { //是循环数数,当下标大于n时,说明已经数了一圈,
                index = 0; //将下标设为零重新开始。
            }
        }
        for (int i = 0; i < n; i++) {
            if (arr[i] == true) {
                System.out.println(i);
            }
        }
    }
}

程序5:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个, 这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

方法1:

public class Demo5 {

    static int ts = 0;// 桃子总数
    static int fs = 1;// 记录分的次数
    static int hs = 5;// 猴子数
    static int tsscope = 5000;// 桃子数的取值范围,太大容易溢出。
    public static int fT(int t) {
        if (t == tsscope) {
            // 当桃子数到了最大的取值范围时取消递归
            System.out.println("结束");
            return 0;
        } else {
            if ((t - 1) % hs == 0 && fs <= hs) {
                if (fs == hs) {
                    System.out.println("桃子数=" + ts + "时满足分桃条件");
                }
                fs += 1;
                return fT((t - 1) / 5 * 4);// 返回猴子拿走一份后的剩下的总数
            } else {
                // 没满足条件
                fs = 1;// 分的次数重置为1
                return fT(ts += 1);// 桃子数加+1
            }
        }
    }

方法2:

 public  class Demo5 {
        public static void main(String[] args) {
            int sum = 0;
            for (int i = 6; ; i++) {// 最少6个分最后一次
                sum = i;// 桃子数
                for (int j = 0; j < 5; j++) {// 分的次数循环
                    if ((sum - 1) % 5 == 0 && j < 5) {// 如果扔一个后能均分5份,继续分
                        sum = (sum - 1) / 5 * 4;// 每分一次剩余桃子数
                        if (j == 4) {// 如果已分5次,且仍能除尽,输出,退出程序
                            System.out.println(i);
                            System.exit(0);
                        }
                    }
                }
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值