暴力破解三元二次方程组

帮朋友解一道考研数学题

今天中午吃饭时被朋友问到一道数学题,让我给看看怎么做

已知a、b、c都是正整数,且满足:

b²=2ac

a+b+c=68

请求出a,b,c

这是一道199管综考研的数学计算题,了解过管综的朋友们应该知道,出题人很喜欢借鉴一些奥数题和竞赛题稍加修改拿出来考学生,这道题也不例外。

其实了解过二次型的同学知道,这道题的思路应该是很清晰的,在不限定a、b、c为正整数的条件时,解是有无穷多个的,另外a和c具有对称性,所以突破口并不在于两个等式,而是在于第一句话:a、b、c都是正整数。

【分析】

1. 解的个数:

首先,我们知道,解方程组时,“元”表示未知数的个数,“次”表示方程组中的最高次幂,而方程组中有效的条件的个数,在线性代数中被称为“秩”,方程组的解也可以根据这些条件,划分为:无解、有限个解、无穷个解,三类情况。

在这道题中,仅仅根据两个等式,是找不到唯一解的,我们将其放在空间坐标系中一探究竟:

将a、b、c分别对应x轴、z轴、y轴,不难发现,b²=2ac是一个椭圆锥形的曲面,它关于平面xoy和y=x对称;而a+b+c=68是一个无限延展的平面;两者的交集为一个椭圆形的点集。两个等式确定下来的点集就是所有的解。

当限定了a、b、c都为正整数之后,解的个数则为有限个解,并且容易分析出a和c具有对称性,所以必为偶数个解。

2. 求解:

<方法1:正整数的奇偶性>

一个正整数,如果不是奇数,那么就必然是偶数;

再根据:{奇×奇=奇}、{奇+偶=奇}

可以进行分析:


b² = 2ac  即:平方数=偶数 \Rightarrow  b不是奇数 \Rightarrow b是偶数(记b = 2r)

a + b + c = 68(偶数) \Rightarrowa+c = 偶数-偶数 = 偶数 \Rightarrowa 和 c 不可能是一奇一偶 \Rightarrowa 和 c 同奇同偶

b²=2ac可以改写为:(2r)²=2ac \Rightarrow2r²=ac \Rightarrow两数乘积为偶数,两数中必有一偶数,即a,c必有一偶数 \Rightarrow又因为a,c同奇同偶 \Rightarrow a 和 c 都是偶数(记 a = 2p , c = 2q)

综上:

a、b、c 都为偶数,各自提出公因子2,

记 b = 2r , a = 2p , c = 2q

有 p + q + r = 34 且 r² = 2pq


由①同理,

p、q、r 也都为偶数,各自提出公因子2

记 r = 2x,p = 2y,q = 2z

有 x + y + z = 17 且 x² = 2yz


 ③

x² = 2yz  \Rightarrow x 是偶数

x + y + z = 17(奇数)  \Rightarrow y + z = 奇数- 偶数 = 奇数   \Rightarrow y和z为一奇一偶

x² = 2yz 即 偶数平方数 = 2 × 奇数 × 偶数

在x + y + z = 17 中找到符合条件的三个整数就不难了,列举就可以

xyz
24(没有奇数质因子)————
416(没有奇数质因子)————
6362(或9)9(或2)
864(没有奇数质因子)————
10100找不到解找不到解

b = 2r = 4x = 4×6 = 24

a = 2m = 4y = 4×2 = 8

c = 2n = 4z = 4×9 = 36 (a,c具有对称性)


综上所述,符合条件的解集为(8,24,36)和(36,24,8)

<方法二:枚举法>

类似于我们学的排列组合,如果a、b、c都是正整数,并且它们的和是68,那么可能的解集是有穷集合,我们可以利用计算机运行一个嵌套循环进而对所有可能的正整数集进行循环遍历,并在每次步进语句进行之前判断该正整数集是否满足b²=2ac的条件

暴力算法:

 代码实现:

public class mathDemo {
    public static void main(String[] args) {
        int[] out = findOut(68);
        System.out.println(Arrays.toString(out));
    }

    public static int[] findOut(int sum) {
        int a = 1;
        int b;
        int c;
        int[] resultSet = new int[3];
        while (a <= sum - 2) {
            b = 0;
            c = sum - a - b;
            while (c > 0) {
                b++;
                c--;
                if (b * b == 2 * a * c) {
                    resultSet[0] = a;
                    resultSet[1] = b;
                    resultSet[2] = c;
                }
            }
            a++;
        }
        return resultSet;
    }
}

 在代码中输入 sum=68 即可返回一个结果集 [36, 24, 8]

这道题暂时想不到什么高级算法,欢迎拍砖

--------------end--------------

原创内容,转载请注明出处,欢迎交流~

CSDN:@Coder_Liufan

知乎:@Wayne

email:928400563@qq.com

2022年3月30日

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Liufan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值