关于百钱百鸡问题以及算法优化
问题描述:
我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
解法如下:
点击查看代码package bqbj;
public class Bqbj {
public static void main(String[] args) {
long startTime=System.nanoTime(); //获取开始时间
Bqbj s1 = new Bqbj();
s1.suanfa1();//测试的代码段
long endTime=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ns");
long startTime1=System.nanoTime(); //获取开始时间
Bqbj s2 = new Bqbj();
s2.suanfa2();//测试的代码段
long endTime1=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime1-startTime1)+"ns");
long startTime2=System.nanoTime(); //获取开始时间
Bqbj s3 = new Bqbj();
s3.suanfa3();//测试的代码段
long endTime2=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime2-startTime2)+"ns");
}
//穷举法
void suanfa1(){
int i,j,k;
for(i = 0;i<=100;i++) {
for(j = 0;j<=100;j++) {
for(k = 0;k<=100;k++) {
if((i + j + k == 100)&&(5*i + 3*j + k/3 == 100)) {
if(k%3==0) {
System.out.println("公鸡为" + i +"\t"+"母鸡为" + j +"\t"+"小鸡为" + k +"\t");
}
}
}
}
}
}
void suanfa2() {
int i,j,k,m;
for(i=0;i<=20;i++){
m = 100-i*5; //缩小了i的范围,减少了遍历
for(j=0;j<=m/3;j++){
k=3*(m-3*j); //k直接可以求出来,不需要在用一个循环
if(i+j+k==100){
System.out.println("公鸡为" + i +"\t"+"母鸡为" + j +"\t"+"小鸡为" + k +"\t");
}
}
}
}
void suanfa3() {
int i,j,k;
for(i = 0;i <= 20;i++) {
j = (200-14*i)/8;
if(j>=0) {
k =100-i-j;
if((i + j + k == 100)&&(5*i + 3*j + k/3 == 100)) {
System.out.println("公鸡为" + i +"\t"+"母鸡为" + j +"\t"+"小鸡为" + k +"\t");
}
}
}
}
}
三种方法所用时间如下:
点击查看代码公鸡为0 母鸡为25 小鸡为75
公鸡为4 母鸡为18 小鸡为78
公鸡为8 母鸡为11 小鸡为81
公鸡为12 母鸡为4 小鸡为84
程序运行时间: 2106100ns
公鸡为0 母鸡为25 小鸡为75
公鸡为4 母鸡为18 小鸡为78
公鸡为8 母鸡为11 小鸡为81
公鸡为12 母鸡为4 小鸡为84
程序运行时间: 76900ns
公鸡为0 母鸡为25 小鸡为75
公鸡为4 母鸡为18 小鸡为78
公鸡为8 母鸡为11 小鸡为81
公鸡为12 母鸡为4 小鸡为84
程序运行时间: 63100ns