【Coding日记】菜鸟编程C语言100例——第三题⚠️

今日收获------解数学方程➕如何将数学问题演变为编程验证问题

📚题目

一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

🧠思路分析

😵‍💫先来看看标准答案(这道题,我是不会做)

👇

假设该数为 x。

1、则:x + 100 = n2, x + 100 + 168 = m2

2、计算等式:m2 - n2 = (m + n)(m - n) = 168

3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数

4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。

5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。

6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。

7、接下来将 i 的所有数字循环计算即可。

🚀精选答案

注释版(新手友好版)

c 复制代码
#include <stdio.h>  // 引入输入输出库,printf需要用它
int main (void)  // 主函数,程序入口
{
    // 定义变量:
    // i、j:168的两个因数(对应n+m和n-m)
    // m、n:两个完全平方数的平方根(代码里的m/n和数学推导里的反过来)
    // x:我们要找的目标数
    int  i, j, m, n, x;
        // 枚举i的范围:i从1到168/2+1(即85)
    // 原因:i和j是168的因数对(i*j=168),i超过84后,j会小于i,会重复枚举(比如i=84,j=2 和 i=2,j=84是同一对)
    for (i = 1; i < 168 / 2 + 1; i++)
    {
        // 第一步:判断i是不是168的因数(能整除168)
        if (168 % i == 0)
        {
            // 如果是因数,计算另一个因数j = 168 / i
            j = 168 / i;
                        // 核心判断条件(对应我们聊的"都是偶数+大小关系"):
            // 1. i > j:保证只处理一次因数对(避免重复,比如i=28,j=6 和i=6,j=28只算一次)
            // 2. (i + j) % 2 == 0:i+j是偶数 → 对应我们说的"n-m和n+m同偶"
            // 3. (i - j) % 2 == 0:i-j是偶数 → 同上,进一步验证奇偶性
            if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)
            {
                // 解方程组:i = n+m,j = n-m → n=(i+j)/2,m=(i-j)/2(代码里的m/n)
                m = (i + j) / 2;  // 代码里的m = 数学里的n(大的平方根)
                n = (i - j) / 2;  // 代码里的n = 数学里的m(小的平方根)
                
                // 反推目标数x:x = 小平方根的平方 - 100(对应x = m² - 100)
                x = n * n - 100;
                
                // 打印结果:验证x+100是n²
                printf ("%d + 100 = %d * %d\n", x, n, n);
                // 打印结果:验证x+268是m²
                printf ("%d + 268 = %d * %d\n", x, m, m);
            }
        }
    }
    return 0;  // 程序正常结束
}

官网答案

c 复制代码
#include <stdio.h>
 
int main (void)
{
    int  i, j, m, n, x;
    for (i = 1; i < 168 / 2 + 1; i++)
    {
        if (168 % i == 0)
        {
            j = 168 / i;
            if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)
            {
                m = (i + j) / 2;
                n = (i - j) / 2;
                x = n * n - 100;
                printf ("%d + 100 = %d * %d\n", x, n, n);
                printf ("%d + 268 = %d * %d\n", x, m, m);
            }
        }
    }
    return 0;
}

🤕我的试错之旅

需求边界:

-输入:

-输出:一个整数

-规则边界:

1.逆运算------逆推演------解方程

2.X+100=Y^2

3.Y2+168=Z2

4.X+268=Z^2

解决方案:

-编程和解方程不一样------对变量赋值,不能用未定变量赋值,只能用具体数字赋值

-因此,这类解方程的逆推演的题目,就是自己先做一部分数学运算,得出具体数字,然后再编程

-编程只能枚举,穷举法------在数学中就是试数法(我们平时所说的笨方法),但是由于计算机的运行速度快,所以试数法在这里可行!

-但是,试数也不能瞎试,得有个范围,不能从-♾️到+♾️吧

-还有就是,在编程里面,还要验证平方根,平方数

-编程里面只能验证,两边计算结果是否相等,以此来验证平方根与奇偶数

-从定义出发:平方,两个相等的根相乘,也就是要么全是奇数,要么全是偶数,二者相等,我们试根

-我们两边都进行穷举(遍历,for)最后用if判断是否相等

-😳还是要,进行数学理论计算,来确定,我们的穷举范围,这才是解题关键点------已经可以确定是用穷举法了

-构造两数相乘等于一个固定数值,这样我们就可以通过合数因子来确定穷举范围

😵‍💫想不明白,不想了······

💬总结碎碎念

数学解方程问题,编程做不了

你想🧠,计算机诞生的牧师是什么?不就是为了帮助科学家做科学计算吗

做科研,不就是不断试错,在试错中"创新"吗

例如现在AI加持下的生物蛋白,实验,我们就可以加速"试错"------当然,听说现在也就有一种技术是"数字孪生",在仿真世界里面进行实验,模型实验成功了,我们再投入实际生产,从而降低成本

相关推荐
长不胖的路人甲8 分钟前
Serial 串行、Parallel 并行、CMS 并发收集器
java·开发语言·jvm
霸道流氓气质1 小时前
分布式系统中接口时序不确定性处理
java·开发语言·分布式
库克克2 小时前
【C++】C++11 包装器function 与 绑定器 bind
开发语言·c++
0x3F(小茶)2 小时前
STM32 SPI的5种方向模式
c语言·stm32·单片机·嵌入式硬件
多加点辣也没关系2 小时前
JavaScript|第30章:事件机制
开发语言·javascript
小大宇2 小时前
python milvus 案例
开发语言·python·milvus
Gauss松鼠会2 小时前
【GaussDB】GaussDB锁阻塞源头查询
java·开发语言·前端·数据库·算法·gaussdb·经验总结
oier_Asad.Chen2 小时前
【洛谷题解/AcWing题解】洛谷P4011 孤岛营救问题/AcWing1131拯救大兵瑞恩
数据结构·笔记·学习·算法·动态规划·图论·宽度优先
逻辑君2 小时前
基于 A2C 算法的双足机器人行走控制
人工智能·深度学习·算法·机器学习·机器人
mingo_敏2 小时前
DeepAgents : 后端(Backends)
java·开发语言