今日收获------解数学方程➕如何将数学问题演变为编程验证问题
📚题目
一个整数,它加上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加持下的生物蛋白,实验,我们就可以加速"试错"------当然,听说现在也就有一种技术是"数字孪生",在仿真世界里面进行实验,模型实验成功了,我们再投入实际生产,从而降低成本