努力學習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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224747.html
標籤:其他
上一篇:全球數百萬臺 Mac 疑似因 Big Sur 更新險釀計算災難,蘋果官方回應來了!
下一篇:小黃鴨除錯法-程式猿修煉之道
