
? ?
博客昵稱:博客小夢(mèng)??
最喜歡的座右銘:全神貫注的上吧!??!
作者簡(jiǎn)介:一名熱愛C/C++,算法等技術(shù)、喜愛運(yùn)動(dòng)、熱愛K歌、敢于追夢(mèng)的小博主!
博主小留言:哈嘍!??各位CSDN的uu們,我是你的博客好友小夢(mèng),希望我的文章可以給您帶來一定的幫助,話不多說,文章推上!歡迎大家在評(píng)論區(qū)嘮嗑指正,覺得好的話別忘了一鍵三連哦!??
前言??
? ? 哈嘍各位友友們??,我今天又學(xué)到了很多有趣的知識(shí),現(xiàn)在迫不及待的想和大家分享一下!??我僅已此文,手把手用C語言講解求兩個(gè)正數(shù)最小公倍數(shù)的3種境界!都是精華內(nèi)容,可不要錯(cuò)過喲!?。??????
必備小知識(shí)~??
什么是最小公倍數(shù)和最大公約數(shù)(最大公因數(shù))?
- 最小公倍數(shù)就是可以整除這兩個(gè)數(shù)的最小的數(shù),例如:6和9的最小公倍數(shù)就是18,3和5的最小公倍數(shù)是15。==也可以說是兩個(gè)數(shù)相乘除以他們的最大公約數(shù)==。
- 最大公約數(shù)的概念和最小公倍數(shù)正好相反,就是兩個(gè)數(shù)都可以整除的最大的數(shù),如3和5的最大公約數(shù)就是1,而6和9的最大公約數(shù)就是3。
求最小公倍數(shù)境界1~ ??
境界1的算法求解過程分析:
- 這里的變量count 主要是求其循環(huán)比較的次數(shù),通過這個(gè)可以比較看出三種境界算法的優(yōu)劣性。
- 先定義一個(gè)count變量存儲(chǔ)這兩個(gè)數(shù)的最大值。
- 如果滿足 max % a != 0 || max % b != 0,就讓最大值加1,直到有一個(gè)能夠被a和b同時(shí)整除的數(shù)就退出循環(huán),這個(gè)數(shù)就是a和b的最小公倍數(shù)。
境界1源碼: ??
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int count = 0;
int max = a > b ? a : b;//先找到最大值
while (max % a != 0 || max % b != 0)
{
max++;
count++;
}
printf("最小公倍數(shù) = %d,比較運(yùn)行的次數(shù) = %d ", max,count);
return 0;
}
代碼結(jié)果運(yùn)行圖: ??
可見count = 39204 ,這個(gè)循環(huán)比較次數(shù)為39204,可見其算法效率非常低效。有沒有更好的算法呢?請(qǐng)耐心看下文分析~
求最小公倍數(shù)境界2~ ??
境界2的算法求解過程分析:
- 這里的變量count 主要是求其循環(huán)比較的次數(shù),通過這個(gè)可以比較看出三種境界算法的優(yōu)劣性。
- 定義一個(gè)變量i,讓它從1開始,符合條件就自增。一個(gè)數(shù)的i倍,即乘以i其表達(dá)式結(jié)果就是這個(gè)數(shù)倍數(shù),如果可以被另一個(gè)數(shù)整除,說明這個(gè)倍數(shù)就是這兩個(gè)數(shù)的公倍數(shù)。因?yàn)閕是從1開始自增的,所以第一個(gè)滿足這個(gè)條件的一定是這兩個(gè)數(shù)的最小公倍數(shù)啦。
境界2源碼: ??
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int i = 1;
int count = 0;
while (i*a % b != 0)
{
i++;
count++;
}
printf("最小公倍數(shù) = %d,比較運(yùn)行的次數(shù) = %d ",i*a,count);
return 0;
}
代碼結(jié)果運(yùn)行圖: ??
可見count = 1781 ,這個(gè)循環(huán)比較次數(shù)為1781,可見其算法效率比境界一有了明顯的改善!那還有沒有比這個(gè)更好的算法呢?請(qǐng)耐心看下文分析~
求最小公倍數(shù)境界3~ ??
輾轉(zhuǎn)相除法流程圖解:
境界3源碼: ??
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int a = m * n;
int r = 0;
int count = 0;
while (r = m % n)
{
m = n;
n = r;
count++;
}
printf("最小公倍數(shù) = %d,比較運(yùn)行的次數(shù) = %d ", a / n, count);
return 0;
}
代碼結(jié)果運(yùn)行圖: ??
可見count = 3 ,這個(gè)循環(huán)比較次數(shù)為3,可見其算法效率真的是太驚人了!,但是這個(gè)算法還是有一個(gè)缺點(diǎn),就是變量 a = m * n。如果這兩個(gè)數(shù)很大,可能它們相乘的結(jié)果太大超出類型的最大數(shù)值。文章來源:http://www.zghlxwxcb.cn/news/detail-797736.html
總結(jié)撒花??
? ?本篇文章旨在帶領(lǐng)大家利用C語言詳解 - 求兩個(gè)正數(shù)最小公倍數(shù)的3種境界。希望大家通過閱讀此文有所收獲!??如果我寫的有什么不好之處,請(qǐng)?jiān)谖恼孪路浇o出你寶貴的意見??。如果覺得我寫的好的話請(qǐng)點(diǎn)個(gè)贊贊和關(guān)注哦~??文章來源地址http://www.zghlxwxcb.cn/news/detail-797736.html
到了這里,關(guān)于你是真的“C”——求兩個(gè)正數(shù)最小公倍數(shù)的3種境界~的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!