努力学习C语言的牧狗(C程序经典100例)———第三题
致敬老大哥,今天的作业特别多,导论的大作业完成后瞬间懵了。图书馆的网络也是出奇的差,所以知道晚上才能发这篇博文。 (+﹏+)~@
第三题:
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
思路:当我们拿到这一题时我们会感到一点点懵,我是谁?我在哪?这是什么鬼啊!难道真的要一个一个去找吗?当然,这是一种做题的方法,应试教育告诉我们,只要题目作对,不管用什么方法。😄(如果考试能看到正确答案,还没有被老师看见也是一种本事。)
在和老大哥(@我才是真正的17号)讨论中,她用了一个非常难想的方法。通过即用因式的循环判断该数是否存在,这种方法确实没有想到,不过我在江苏模拟卷的数列压轴题见过这种方法,是第二问你求出一个数列在第三问加以变形,问数列是否为素数。当时只是稍微看看,并没有深究。
老大哥解题思路如下:
假设该数为 x。
1、则:x + 100 = n * n, x + 100 + 168 = m * m
2、计算等式:m * m - n * n = (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 的所有数字循环计算即可。
相应代码为:
#include <stdio.h>
int main ()
{
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;
}
我的脑子并没有如此灵光,这种方法我以后再遇到这一题也无法很快的想到,于是我就想有没有更简单的方法,我突然想到执果索因的数学思维,我可以先找到完全平方开出的数,之后再平方,看看平方后的结果和原数是否相等:
解:
#include<stdio.h>
#include<math.h>
main()
{
int x, y, i;
for(i=1;i<=1000000;i++)
{
x = sqrt(i + 100);
y = sqrt(i + 268);
if(x*x==100+i&&y*y==268+i)
{
printf("%d\n",i);
}
}
}
这样很明显能够得到三个数字是满足条件的 。 ╮( ̄▽  ̄)╭
反思:在做这个代码时我定没有审清题目,是再加上168,而我大意了啊!没有闪,直接只加上168,导致一开始几次都解不出来结果。C语言和数学的很多思想和公式都是挂钩的,果然老话“学号数理化,走遍天下都不怕”是有根据的。如果有灵活的思想,对于C语言的编程是会事半功倍的。
后话:因为最近四级考试口语快到了,英语学渣我需要进行备考,最近的更速可能会放慢,如果大家想看日更,可以去看我的老大哥,谢谢大家! ~ (__)(-.-)(o)