華為機試題 最小公倍數

2021-06-22 15:45:45 字數 1395 閱讀 1937

今天去華為機試,這是我第一次到華為機試,以前聽同學說華為的機試很簡單,基本上會個冒泡就可以通過了,所以我也就沒怎麼準備。結果我只做對了一道

華為機試一共三道題,分為簡單,中,難。聽那些監考官說,簡單和中都是挺簡單的。先看這兩題,會哪道做哪道。

我抽到的題:

1.最小公倍數。

2.給定年月日,與1990/01/01,相差多少天。

3.題目有點長,其實也挺簡單的。

看到第一題,第二題。做過acm的都知道它是水題。。

看到第一題,我就知道可以用輾轉相除法先求最大公約數,然後最小公倍數也就求出來了。

可是。。。我忘了最大公約數怎麼寫了。

於是。。

我用了暴力的方法,不解釋了。

int bruteversion(int a,int b)

else

for (int i = 2; i <= min;)

else

}int sum = 1;

for (vector::iterator iter = veci.begin(); iter != veci.end(); ++iter)

return sum * min * max;

}

晚上回到宿舍,我才到網上查了一下輾轉相除法。原來真的挺簡單的。

輾轉相除法 原理:

求ab的最大公約數:

a=mb+c(帶餘除法:輾轉相除法的步驟)

設n是a,b的最大公約數,則上式可寫成na`=mnb`+c

所以,c=n(a`-mb`),所以n也是c的公約數。

同理可證,bc的最大公約數也是a的公約數

求得a,b的最大公約數c之後,就可以通過求a,b與c 的商的乘積 再 與c 的乘積就是a,b的最小公倍數了。

所以得到一下程式。

int ******version(int a, int b)

return b * (tmpa / b) * (tmpb / b);

}

簡單很多吧。

完整測試**:

#include #include using namespace std;

int ******version(int a, int b);

int bruteversion(int a,int b);

int main()

else

for (int i = 2; i <= min;)

else

}int sum = 1;

for (vector::iterator iter = veci.begin(); iter != veci.end(); ++iter)

return sum * min * max;

}

最小公倍數

最大公倍數最大是兩個數的乘積,兩個數互質 最大公約數是1 幾個數共有的倍數叫做這幾個數的公倍數,其中除0以外最小的乙個公倍數,叫做這幾個數的最小公倍數。記作 a,b 與最小公倍數相對應的概念是最大公約數,a,b的最大公約數記為 a,b 關於最小公倍數與最大公約數,我們有這樣的定理 a,b a,b a...

最小公倍數

問題描述 編寫一函式lcm,求解兩個正整數的最小公倍數。樣例輸入 乙個滿足題目要求的輸入樣例。例 3 5 樣例輸出 與上面樣例對應的輸出。例 15 資料規模和約定 輸入資料中每乙個數的範圍 例 兩個數都小於65536.演算法分析 一般來說,求兩個正整數a b的最小公倍數的演算法思路很簡單,主要分為以...

最小公倍數

求n個數的最小公倍數。輸入 輸入包含多個測試例項,每個測試例項的開始是乙個正整數n 2 n 10 然後是n個正整數。輸出為每組測試資料輸出它們的最小公倍數,每個測試例項的輸出佔一行。你可以假設最後的輸出是乙個32位的整數。樣例輸入 2 4 6 3 2 5 7 樣例輸出 1270 題目 zjgsuto...