【Code Pratice】—— 切面条、大衍数列、门派制作、方阵转置、微生物繁殖
Date:2022?10?01\color{FF99FF}{Date:2022-10-01}Date:2022?10?01
Gaffes\color{FF99FF}{Gaffes}Gaffes is\color{FF99FF}{is}is accidentally\color{FF99FF}{accidentally}accidentally say\color{FF99FF}{say}say the\color{FF99FF}{the}the truth!\color{FF99FF}{truth!}truth!
文章目錄
- 🍓1. 切面條🍓
- 🍇題目🍇
- 🍇思路🍇
- 🍇代碼🍇
- 🍎2. 大衍數列🍎
- 🍆題目 🍆
- 🍆思路🍆
- 🍆代碼 🍆
- 🍅3. 門牌制作🍅
- 🌸題目🌸
- 🌸思路🌸
- 🌸代碼🌸
- 🥭4. 方陣轉置🥭
- 🌷題目🌷
- 🌷思路🌷
- 🌷代碼🌷
- 🍊5. 微生物增殖🍊
- 🌺題目🌺
- 🌺思路🌺
- 🌺代碼🌺
🍓1. 切面條🍓
🍇題目🍇
一根高筋拉面,中間切一刀,可以得到2根面條。如果先對折1次,中間切一刀,可以得到3根面條。如果連續對折2次,中間切一刀,可以得到5根面條。 那么,連續對折10次,中間切一刀,會得到多少面條呢?
🍇思路🍇
思路:題目的關鍵在于“對折”。對折的基礎是只有一根面條,與簡單的多根面條堆疊在一起不一樣,每一次對折時,彎曲部位都會形成一根新的面條,解題的關鍵就是找到這個規律。多列幾組數據可以更方便的找到這個規律
| 0 | 1 |
| 1 | 3 |
| 2 | 5 |
| 3 | 9 |
| 4 | 17 |
從上面四組數據可以找出下面的規律:
對折 0 次:2根 --> 2
對折 1 次:3根 --> 2 + 2 ^0
對折 2 次:5根 --> 2 + 2^0 + 2^1
對折 3 次:9根 --> 2 + 2^0 + 2^1 + 2^2
對折 4 次:17根 --> 2 + 2^0 + 2^1 + 2^2 + 2^3
也就是說每多對折 N 次,那么就能多得到 2^(N - 1) 根面條,找到這個規律,題目就很好解了。
按照上面的規律,將對折0次到對折N次得到的面條數相加就是題目要求所得,而規律性的暴力題解,可以直接聯想到 [迭代] 和 [遞歸] 兩種方式
因為從對折1次時才實際增加面條數,所以遍歷次數從1開始,初始面條數為2
相對于迭代,遞歸的方式有時候可能會比較繞,比較難理解,這里先說下怎么去更好的理解遞歸,要怎么使用遞歸
遞歸三部曲
🍇代碼🍇
int CutNoodles(int i_Foldnum) {if (0 > i_Foldnum){return -1;}int o_Noodlenums = 2;#if 0/* 迭代 */for (int i = 1; i <= i_Foldnum; i++){int Singlenums = 1;/* 對折 N 次,增加 2^(N - 1) 根 */int j = i - 1;while (j--){Singlenums *= 2;}o_Noodlenums += Singlenums;}return o_Noodlenums;#else/* 遞歸 */if (0 == i_Foldnum){return o_Noodlenums;}else{return o_Noodlenums * CutNoodles(i_Foldnum - 1) - 1;}#endif }🍎2. 大衍數列🍎
🍆題目 🍆
大衍數列規律如下:
例子:
0 2 4 8 12 18 24 32 40 50
🍆思路🍆
按照題目所給規律直接寫邏輯就好了
🍆代碼 🍆
int DYSequence(vector<int>& i_Array, int i_Length) {if (0 > i_Length){return -1;}for (int i = 1; i <= i_Length; i++){if (0 == (i % 2)){i_Array[i - 1] = (i * i) / 2; }else{i_Array[i - 1] = ((i * i) - 1) / 2;}}return 0; }🍅3. 門牌制作🍅
🌸題目🌸
小藍要為街道的住戶制作門牌號,制作的方法為每個門的制作都會先將對應的0~9這10個數字制作出來,然后再貼到門牌上
如果要為N位住戶制作門牌號,共需要制作多少個字符2?
🌸思路🌸
這實際上是一個求數值每一位上的數字問題,只需要從第一位住戶開始,統計對應門牌號上數字2的位數的總和即可
🌸代碼🌸
int HouseNumPro(int i_HouseNum) {if (0 >= i_HouseNum){return -1;}int o_CharNum = 0;for (int i = 1; i <= i_HouseNum; i++){int j = i;while (j){if (2 == (j % 10)){o_CharNum++;}j /= 10;}}return o_CharNum; }🥭4. 方陣轉置🥭
🌷題目🌷
給定一個NxM的矩陣,求它的轉置。
🌷思路🌷
轉置的思路很簡單,就是長變寬,寬變長
將原矩陣的N當作轉置后的M,原矩陣的M當作轉置后的N即可
🌷代碼🌷
int SquareMatrixTranspose(vector<vector<int> > i_SquMX, int i_Length, int i_Width) {if (0 > i_Length || (0 > i_Width)){return -1;}for (int i = 0; i < i_Width; i++){for (int j = 0; j < i_Length; j++){cout << i_SquMX[j][i] << "\t";}cout << endl;}cout << endl;return 0; }🍊5. 微生物增殖🍊
🌺題目🌺
假設有兩種微生物 X 和 Y
X出生后每隔3分鐘分裂一次(數目加倍),Y出生后每隔2分鐘分裂一次(數目加倍)。
一個新出生的X,半分鐘之后吃掉1個Y,并且,從此開始,每隔1分鐘吃1個Y。
現在已知有新出生的 X=10, Y=89,求60分鐘后Y的數目。
如果X=10,Y=90呢?
🌺思路🌺
題目給出三個關鍵信息
只要按照上面三個關鍵點進行X和Y的數量計算即可,為了方便計算,關鍵信息[0.5 2 3]都擴大兩倍為整型[1 4 6]
🌺代碼🌺
int MicrobialReproducte(int i_Xnum, int i_Ynum, int i_Minute) {int XSum = i_Xnum;int YSum = i_Ynum;for (int i = 1; i <= i_Minute * 2; i++){if (i % 2 == 1){YSum -= XSum;}if (i % 6 == 0){XSum = XSum * 2;}if (i % 4 == 0){YSum = YSum * 2;}}return YSum; }總結
以上是生活随笔為你收集整理的【Code Pratice】—— 切面条、大衍数列、门派制作、方阵转置、微生物繁殖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建系统|为何我坚持要用Python搭建
- 下一篇: 使用Python语言读JPG文件获取尼康