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

相关推荐
551只玄猫1 小时前
【数学建模 matlab 实验报告12】聚类分析和判别分析
开发语言·数学建模·matlab·课程设计·聚类·实验报告
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
海清河晏1113 小时前
数据结构 | 单循环链表
数据结构·算法·链表
H Journey3 小时前
C++之 CMake、CMakeLists.txt、Makefile
开发语言·c++·makefile·cmake
wuweijianlove7 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong8 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志8 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
lly2024068 小时前
C 标准库 - `<stdio.h>`
开发语言
沫璃染墨8 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
jwn9998 小时前
Laravel6.x核心特性全解析
开发语言·php·laravel