每日作业20200429 - 二元一次方程 解鸡兔同笼

题目

鸡兔同笼, 共有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
方程11.0 * x + 1.0 * y  = 35.0

方程2,a2 = 2
方程2,b2 = 4
方程2,c2 = 94
方程22.0 * x + 4.0 * y  = 94.0

该方程组有唯一解,为:x = 23.0 , y = 12.0


1.该代码略冗长,可对方法进行封装使代码简洁,如参数输入方法

2.该代码采用的是二元一次方程的求根公式进行求解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值