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

相关推荐
阿里嘎多学长36 分钟前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
叶小鸡2 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
梅羽落2 小时前
win11打开关闭麦克风
经验分享
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
昵称小白2 小时前
复杂度分析方法
算法
科研前沿3 小时前
2026 数字孪生前沿科技:全景迭代报告 —— 镜像视界生成式孪生(Generative DT)技术白皮书
大数据·人工智能·科技·算法·音视频·空间计算
时空系3 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
leo__5204 小时前
IEC 104 协议 C 语言实现
c语言·数据库
CHANG_THE_WORLD4 小时前
python 批量终止进程exe
开发语言·python
古城小栈4 小时前
从 cargo-whero 库中,找到提升 rust 的契机
开发语言·后端·rust