算法篇---java算法应用

算法应用之百钱买白鸡

案列说明:主要内容是:公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元怎样可以买100鸡?

思想:想要实现此算法,只要明白各种条件的关系即可,而且知道公鸡最多买20只,母鸡最多买33只,小鸡最多买100只,这样买各种鸡的钱总为100,元,鸡的只数也是100;

实现代码:

package 算法应用;
/**
 * 
 * @author Administrator
 *
 */
public class BQMJ {
    public static void main(String[] args) {
        int cock,hen,chicken=0;
        for(cock=0;cock<=19;cock++){
            for(hen=0;hen<=33;hen++){
                chicken=100-cock-hen;
                int p;
                p=chicken%3;
                if(((5*cock+3*hen+chicken/3)==100)&&(p==0)){
                    System.out.print("    可以买公鸡的只数:"+cock);
                    System.out.print("    可以买母鸡的只数:"+hen);
                    System.out.print("    可以买小鸡的只数:"+chicken);
                    System.out.println("\n");
                }
            }
        
}
    }
}

运行结果:

算法应用之韩信点兵

案列说明:韩信带兵不足百人,3人一行排列多一人,7人一行排列少两人,5人一行正好,本例是计算韩信究竟点了多少兵?

想法:对于韩信点兵算法,只需将7人少2人转换7人多5人,这样解决问题的方法就很明显了,再限定人数不多于100即可。

实现代码:

package 算法应用;

public class Hxin {
    public static void main(String[] args){
        int a=0,b=0,c=0,preson;      //定义总人数和各种站法的剩余人数
        for(preson=0;preson<100;preson++){
            a=preson%3;              //每排三人剩余人数
            b=preson%7;              //每排七人的剩余人数
            c=preson%5;              //每排五人的剩余人数
            if(a==1&&b==5&&c==0){     //都符合条件时的人数
                System.out.println("韩信带的兵数是:"+preson);
            }
        }
    }
}

得出结果为:40人

算法应用之斐波那契数列

说明:斐波那契数列的定义:它的第一项和第二项均为1,以后各项都为前两项之和

难点:如何设计好循环

实现代码:

package 算法应用;
import java.util.Scanner;
public class Fbo {
    private static void f(int x){
        int f1=1,f2=1,i=3;
        if(x==1)System.out.print(f1);
        if(x==2)System.out.print(f1+"  "+f2);
        if(x>=3){                 //求位置大于三的数列
            System.out.print(f1+"  "+f2);
            while(x>=i){         //求数列
                f1=f2+f1;        //求两项之和
                System.out.print("  "+f1);
                i++;
                f2=f2+f1;
                System.out.print("  "+f2);                
            }
        }  
    }
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        System.out.println("请输入你想查看的斐波那契数列个数:");
        int num=s.nextInt();
        System.out.println("你想看的斐波那契数列:");
        f(num/2+1);
    }
}

运行结果:

算法应用之汉诺塔

案列说明:汉诺塔问题是一个古典的数学问题,内容是:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

难点:将n个盘子从一个座移到另一个座上,这是每个移动者要做的,除去第一个移动者外,其余都要命令其他的移动者,就是第一个移动者开始,任务层层下放,最后将一个盘子从一个座移到另一个座上,这是第一个移动者自己做的工作,

实现代码:

package 算法应用;
import java.util.Scanner;
public class Hanoi {

    private static void move(char x,char y){
        System.out.printf("%c-->%c",x,y);
        System.out.print("\n");
    }
    private static void hanoit(int n,char one,char two,char three){     //将n个盘子从第一座借助第二座移到第三座
        if(n==1){                           //如果只有一个盘子
            move(one,three);
        }
        else{
            hanoit(n-1,one,three,two);      //将一上的盘子借助三移到二上
            move(one,three);
            hanoit(n-1,two,one,three);      //将二上的盘子借助一移到三上
        }
    }
    public static void main(String[] args) {
        int m;
        System.out.println("请输入你要移动的盘子数:");
        Scanner s=new Scanner(System.in);
        m=s.nextInt();
        System.out.println("移动"+m+"个盘子的步骤如下");
        hanoit(m,'A','B','C');

    }
}

运行结果:

posted @ 2015-01-14 23:03  偶my耶  阅读(37553)  评论(4编辑  收藏  举报