若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。
前言
本專欄內容將會以輕松、簡單的方式完成習題的解答,用情景再現的文章風格使讀者能夠在輕松愉悅的閱讀氛圍中完成知識的吸收,本專欄考慮讀者的吸收能力,不講解過多高效的計算方法,降低閱讀門檻,希望各位多多支持~
作者簡介
作者名:1_bit
簡介:CSDN博客專家,2020年博客之星TOP5,藍橋簽約作者。15-16年曾在網上直播,帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息,迷茫的你會找到答案。
博客地址:https://i1bit.blog.csdn.net
情景再現(以下內容不考慮數字 1 為約數)
👸小媛:小C 今天我又遇見一個我不懂的知識點了。 😰
🐰小C:什么知識點?
👸小媛:是數學相關的。 😭
🐰小C:正常,很多知識點不用就會忘記的,沒什么好擔心的。說吧,是什么知識點呢?
👸小媛:就是公約數,公約數我忘記了是什么知識了。 😫
🐰小C:哈哈哈,沒事,其實我也忘記什么是公約數了,剛剛就在你提問的瞬間我搜索了一下然后就記起來了。
👸小媛:你是在安慰我。
🐰小C:哈哈哈,真的,忘記很正常,你也別沮喪了,我先告訴你什么是公約數吧?
👸小媛:跪謝大佬指教! 😐
🐰小C:我們先看看什么是約數吧。如果有一個自然數例如 15,這個數字 15 能夠被 5 整除,這個時候我們就可以稱 5 是 15 的約數,15 則是 5 的倍數,這個知識點懂了吧?
👸小媛:哈哈哈,懂了,原來那么簡單。
🐰小C:那我們再看看公約數是什么。現在我們假設有兩個數,一個是 15 一個是 30,他們兩者都可以被同樣的數字整除,例如 5、10、15,那么 5、10、15 這幾個數就是 15 與 30 的 公有 約數,所以我們就稱為公約數。
👸小媛:唔,我懂了,我現在是要寫一道題目,需要用戶輸入兩個數字,然后判斷這兩個數的最大公約數和最小公約數。 😂
🐰小C:嗯,挺簡單的。你看 5、10、15 是 15 月 30 的公約數,那么最大的公約數就是 15,最小的公約數就是 5了,簡單吧。
👸小媛:哈哈哈,簡單是簡單,那程序要怎么寫呢?
🐰小C:首先肯定是要用戶輸入兩個數吧?
👸小媛:是的。
🐰小C:那你就寫出來吧,如何接收用戶輸入并且存儲兩個變量的代碼。
👸小媛:嗯,寫好了,在下面。
int a,b;
printf("請輸入兩個數,并且使用空格間隔:");
scanf("%d%d", &a, &b);
👸小媛:我創建了兩個變量,一個是 a 一個是 b,分別存儲用戶輸入的內容,但是接下來我不懂怎么做了。
🐰小C:接下來也很簡單,但是我得先告訴你一個概念。例如有兩個數,一個是 15 一個是 30,他們之間的公約數有哪些?
👸小媛:有 5 和 15。
🐰小C:最大公約數此時是 15,你發現了嗎?他們之間最大的公約數,是不能超過 15 與 30 之間最小的那個數的。
👸小媛:真的嗎?
🐰小C:那我給你舉個例子吧,現在有兩個數 20 和 40,他們之間最大公約數是幾呢?
👸小媛:是 20 。
🐰小C:那 50 跟 100 呢?他們之間的最大公約數是幾呢?
👸小媛:最大公約數是 50,好像是真的耶,他們之間的最大公約數是不能超過求最大公約數的兩個數中最小的那一個。
🐰小C:因為數值本身除本身就是 1,若你超過了那不就是小數了嗎?
👸小媛:哈哈哈,是這個理。 😋
🐰小C:所以接下來我們就很簡單的做了。編寫一個循環,這個循環的循環變量等于求最大公約數中最小的一個,此時循環變量只要每次減 1,循環的尋找最大公約數就可以了。
👸小媛:為什么要每次都減 1 呢?
🐰小C:就像 15 和 25 的最大公約數 5 一樣,必定是小于15 的,此時我們只需要從 15 遞減去尋找,那么肯定就會找得到這個值。
👸小媛:唔,懂了,所以代碼是不是應該要寫成這樣?
#include<stdio.h>
int main()
{int a,b,i;printf("請輸入兩個數,并且使用空格間隔:");scanf("%d%d", &a, &b);if(a>b){i=b;}else{i=a;}for(; i>0; i--){}return 0;
}
🐰小C:對的,你寫對咯。首先我們使用 if 語句,判斷輸入的值 a 與 b 哪一個比較小,如果 b 數值小的話就存儲到循環變量 i 中,否則 i 就是存儲變量 a 的內容,此時通過 i 這個循環變量進行遞減,就可以逐步的找到最大公約數了。但是你的代碼這里有點問題喲。
👸小媛:什么問題? 😱
🐰小C:就是你是否允許 a 數和 b 數兩者的值一樣呢?
👸小媛:嗯,不允許吧。對喲,我應該加個判斷,不允許兩個數一致,我代碼改成這樣了,你看一下。
#include<stdio.h>
int main()
{int a,b,i;printf("請輸入兩個數,并且使用空格間隔:");scanf("%d%d", &a, &b);if(a==b){printf("\n 兩個數不能相等");return 0;}if(a>b){i=b;}else{i=a;}for(; i>0; i--){}return 0;
}
👸小媛:結果也測試了。
🐰小C:嗯,你在用戶輸入數字后,判斷兩個數值是否相等,如果相等就使用 return 進行程序跳出,不錯,是寫對了。現在開始添加判斷最大公約數的代碼吧,現在會了吧?
👸小媛:當然會了,循環中添加這個代碼就可以了。
for(; i>0; i--){if(a%i==0 && b%i==0){printf("最大公約數是:%d\n", i);break;}
}
🐰小C:不錯,代碼是正確的,直接使用 if 語句判斷 a 數和 b 數 兩個數除循環變量 i ,如果都是除的斷那么這個循環變量 i 此時就是約束,如果是第一次找到這個 i 除的斷那么就是最大公約數,此時在 if 語句后添加一個 break 直接跳出,那么就保證了此時找到數是最大公約數了。
👸小媛:那是,厲害吧,完整代碼在下面。
#include<stdio.h>
int main()
{int a,b,i;printf("請輸入兩個數,并且使用空格間隔:");scanf("%d%d", &a, &b);if(a==b){printf("\n 兩個數不能相等");return 0;}if(a>b){i=b;}else{i=a;}for(; i>0; i--){if(a%i==0 && b%i==0){printf("最大公約數是:%d\n", i);break;}}return 0;
}
🐰小C:那我們舉一反三吧,最小公約數怎么求呢?
👸小媛:那就反過來,從 1 開始往上加,但是不能超過 a 數與 b 數中最小的那個數,此時找到了就輸出,并且直接使用 break 進行跳出,那么肯定就是最小公約數了;或者還有一種少改動的方法,就是不用 break,新建一個變量,反正每次有約數就覆蓋掉之前的元素,這樣處理到最后一個肯定就是最小約數了,但是還有一個條件不能等于1,代碼寫出來了。 😎
#include<stdio.h>
int main()
{int a,b,i,min=0;printf("請輸入兩個數,并且使用空格間隔:");scanf("%d%d", &a, &b);if(a==b){printf("\n 兩個數不能相等");return 0;}if(a>b){i=b;}else{i=a;}for(; i>0; i--){if(a%i==0 && b%i==0){if(i!=1){min=i;}}}printf("最小公約數是:%d\n", min);return 0;
}
🐰小C:行吧行吧,雖然效率不行但是你的腦子可以。
👸小媛:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈。 👍
本專欄已參加 CSDN 蓄力計劃,感謝讀者支持。