题目
鸡兔同笼, 共有35头, 94脚. 求有几只鸡几只兔
分析
1.列方程组
x + y = 35
2x + 4y = 94
2.求解
x = 23
y = 12
**拓展**
二元一次方程表达式
ax + by = c
mx + ny = d
代码
public class Homework0429 {
public static void main(String[] args) {
int c = 0; //表示鸡的数量
int r = 0; //表示兔的数量
for(c = 0; c <= 35; c++ ){ //从鸡的数量,开始遍历
for( r = 35 - c; r >= 0; r--){ //从兔的数量开始遍历
if( (2 * c + 4 * (35 - c)) == 94 ){ //判定条件
System.out.println("鸡有:" + c + "\t兔有:" + r);
break; //满足时退出本次循环(结果的唯一性,当鸡的数量为a时,则兔的数量至多有一个解)
}
}
}
}
}
运行结果
鸡有:23 兔有:12
总结
1.本题本质为解数学题,特定题目下,可以优化方程,进而使代码更简洁,缩短运算时间;
2.本题代码不够简洁,循环次数过多(鸡和兔都是遍历了 0~35)
二元一次方程组的通用解
代码
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//提示用户输入参数(此程序不做输入判断)
System.out.println("请参照 a * x + b * y = c 的格式输入方程参数!");
//根据提示输入方程1的参数
System.out.print("方程1,a1 = ");
double a1 = sc.nextDouble();
System.out.print("方程1,b1 = ");
double b1 = sc.nextDouble();
System.out.print("方程1,c1 = ");
double c1 = sc.nextDouble();
double[] d1 = {a1, b1, c1}; //将方程1的参数放进数组中
System.out.println( "方程1:" + a1 + " * x + " + b1 + " * y " + " = " + c1 + "\n");
//根据提示输入方程2的参数
System.out.print("方程2,a2 = ");
double a2 = sc.nextDouble();
System.out.print("方程2,b2 = ");
double b2 = sc.nextDouble();
System.out.print("方程2,c2 = ");
double c2 = sc.nextDouble();
double[] d2 = {a2, b2, c2}; //将方程2的参数放进数组中
System.out.println( "方程2:" + a2 + " * x + " + b2 + " * y " + " = " + c2 + "\n");
method(d1, d2); //调用方法
}
/**
* 用以解二元一次方程组
* @param d1 方程1的参数
* @param d2 方程2的参数
*/
public static void method(double[] d1, double[] d2) {
//d1[0] * x + d1[1] * y = d1[2];
//d2[0] * x + d2[1] * y = d2[2];
double x = 0; //方程组未知数
double y = 0; //方程组未知数
double a = d1[0] / d2[0]; //系数比
double b = d1[1] / d2[1]; //系数比
double c = d1[2] / d2[2]; //系数比
if (d1[0] * d1[1] * d2[0] * d2[1] != 0) { //判断,是否为二元一次方程,是 则执行下述语句
if (a != b) { //判断,有唯一解
x = (d2[1] * d1[2] - d1[1] * d2[2]) / (d2[1] * d1[0] - d1[1] * d2[0]);
y = (d2[0] * d1[2] - d1[0] * d2[2]) / (d2[0] * d1[1] - d1[0] * d2[1]);
System.out.println("该方程组有唯一解,为:x = " + x + " , y = " + y);
} else if (a == b && a == c) {
System.out.println("该方程组有无穷多解!");
} else {
System.out.println("该方程组无解!");
}
} else { //判断,是否为二元一次方程,否 则执行下述语句
System.out.println("这不是二元一次方程组!"); //此处可引用解一元一次方程的方法
}
}
}
运行结果
请参照 a * x + b * y = c 的格式输入方程参数!
方程1,a1 = 1
方程1,b1 = 1
方程1,c1 = 35
方程1:1.0 * x + 1.0 * y = 35.0
方程2,a2 = 2
方程2,b2 = 4
方程2,c2 = 94
方程2:2.0 * x + 4.0 * y = 94.0
该方程组有唯一解,为:x = 23.0 , y = 12.0
注
1.该代码略冗长,可对方法进行封装使代码简洁,如参数输入方法
2.该代码采用的是二元一次方程的求根公式进行求解