【Code Pratice】—— 乘积尾零、分数、第几个幸运数字
文章目錄
- 1 | 乘積尾零
- 題目
- 思路
- 邏輯代碼
- 2 | 分數
- 題目
- 思路
- 邏輯代碼
- 3 | 第幾個幸運數
- 題目
- 思路
- 邏輯代碼
1 | 乘積尾零
題目
如下的10行數據,每行有10個整數,請你求出它們的乘積的末尾有多少個零?
5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 1486 5722 3135 1170 4014 5510 5120 729 2880 9019 2049 698 4582 4346 4427 646 9742 7340 1230 7683 5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 6701 6645 1671 5978 2704 9926 295 3125 3878 6785 2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 689 5510 8243 6114 337 4096 8199 7313 3685 211思路
剛看到題目,首先想到的就是把乘積進行求余10操作,有幾次求余10為0,那就有幾個尾零,這個想法很暴力,初想貌似可行,但是有個問題,這些數字的乘積一定會爆掉數據的最大范圍,那么這樣的思路就存在很大問題了
換個想法,末尾有0,說明這個乘積肯定是10的倍數,而10的由來有兩種
- 2 * 5 = 10
- 1 * 10 = 10
那么可以判斷兩個數相乘的數中是否可以組成上面兩種方式
具體思路如下:
例子
比如 15 * 48 * 20 = 14400,其中
- 15 = 3 * 5
- 48 = 2 * 2 * 2 * 2 * 3
- 20 = 2 * 2 * 5
三個數字共有 因子2 6個, 因子5 2個,而這些因子最終只能組成兩組完整的 2 * 5,所以答案就是 因子5的個數
邏輯代碼
int ProTailZero(int i_uNum) {int res = -1;if (1 > i_uNum){return res;}int inNum = 0;int num5 = 0;int num2 = 0;for (int i = 0; i < i_uNum; i++){cout << "Please input num [" << i << "]: ";cin >> inNum;while (0 == inNum % 5){num5++;inNum /= 5;}while (0 == inNum % 2){num2++;inNum /= 2;}}res = num5;if (num2 < num5){res = num2;}return res; }2 | 分數
題目
1/1+1/2+1/4+1/8+1/161/1 + 1/2 + 1/4 + 1/8 + 1/161/1+1/2+1/4+1/8+1/16 ……, 每一項都是前一項的一般,如果一共有20項,求這個和是多少,結果用分數表示出來,類似 3/23/23/2,分母要求互質(即最簡式)
思路
這是很典型的數學題 —— 等比數列求和,有題目可知
- 公比 q=12q = \frac{1}{2}q=21?
- 首項 a1a_1a1? = 1
套入求和公式
Sn=na1(q=1)S_n = na_1 (q = 1)Sn?=na1?(q=1)
Sn=a1(1?qn)1?q(q≠1)S_n = \frac{a_1 (1 - q^n)}{1-q} (q\neq1)Sn?=1?qa1?(1?qn)?(q=1)
而本題要求結果為最簡式,把首項和公比套入公式的得到最終式子 sn=2?(12)n?1s_n = 2 - (\frac{1}{2})^{n-1}sn?=2?(21?)n?1
邏輯代碼
int Pow(int i_uDigits, int i_uNum) {if (1 == i_uDigits){return 1;}else if (i_uNum > 0){return i_uDigits * Pow(i_uDigits, i_uNum - 1);}else{return 1;} }int Fraction(int i_uNum) {int res = -1;if (1 > i_uNum){return res;}res = 1;int Molecular = 1;int Denominator = 1;Denominator = Pow(2, i_uNum - 1);cout << "Denominator = " << Denominator << endl;Molecular = (2 * Denominator) - 1;cout << "The sum of the first " << i_uNum << " terms of the isometric series is [" << Molecular << "/" << Denominator << "]." << endl;return res; }3 | 第幾個幸運數
題目
到x星球旅行的游客都被發給一個整數,作為游客編號。
x星的國王有個怪癖,他只喜歡數字3,5和7。
國王規定,游客的編號如果只含有因子:3,5,7,就可以獲得一份獎品。
我們來看前10個幸運數字是:3 5 7 9 15 21 25 27 35 45
因而第11個幸運數字是:49
小明領到了一個幸運數字 59084709587505,他去領獎的時候,人家要求他準確地說出這是第幾個幸運數字,否則領不到獎品。
請你幫小明計算一下,59084709587505是第幾個幸運數字。
思路
首先確定幸運數的判斷規則:只含有因子3,5,7,也就是說滿足條件的幸運數有以下幾種
思路如下:
邏輯代碼
int LuckyNumber(long long i_u32Num) {int res = 0;if (3 > i_u32Num){return res;}res = 1;for (long long i = 3; i < i_u32Num; i++){long long tmp = i;while (!(tmp % 3)){tmp /= 3;}while (!(tmp % 5)){tmp /= 5;}while (!(tmp % 7)){tmp /= 7;}if (1 == tmp){res++;}}return res; }總結
以上是生活随笔為你收集整理的【Code Pratice】—— 乘积尾零、分数、第几个幸运数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RJ45和RJ11
- 下一篇: python面试题网站有哪些_扣丁学堂解