今天去華為機試,這是我第一次到華為機試,以前聽同學說華為的機試很簡單,基本上會個冒泡就可以通過了,所以我也就沒怎麼準備。結果我只做對了一道
華為機試一共三道題,分為簡單,中,難。聽那些監考官說,簡單和中都是挺簡單的。先看這兩題,會哪道做哪道。
我抽到的題:
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...