【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. 大衍數(shù)列🍎
- 🍆題目 🍆
- 🍆思路🍆
- 🍆代碼 🍆
- 🍅3. 門牌制作🍅
- 🌸題目🌸
- 🌸思路🌸
- 🌸代碼🌸
- 🥭4. 方陣轉(zhuǎn)置🥭
- 🌷題目🌷
- 🌷思路🌷
- 🌷代碼🌷
- 🍊5. 微生物增殖🍊
- 🌺題目🌺
- 🌺思路🌺
- 🌺代碼🌺
🍓1. 切面條🍓
🍇題目🍇
一根高筋拉面,中間切一刀,可以得到2根面條。如果先對折1次,中間切一刀,可以得到3根面條。如果連續(xù)對折2次,中間切一刀,可以得到5根面條。 那么,連續(xù)對折10次,中間切一刀,會得到多少面條呢?
🍇思路🍇
思路:題目的關(guān)鍵在于“對折”。對折的基礎(chǔ)是只有一根面條,與簡單的多根面條堆疊在一起不一樣,每一次對折時(shí),彎曲部位都會形成一根新的面條,解題的關(guān)鍵就是找到這個(gè)規(guī)律。多列幾組數(shù)據(jù)可以更方便的找到這個(gè)規(guī)律
| 0 | 1 |
| 1 | 3 |
| 2 | 5 |
| 3 | 9 |
| 4 | 17 |
從上面四組數(shù)據(jù)可以找出下面的規(guī)律:
對折 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) 根面條,找到這個(gè)規(guī)律,題目就很好解了。
按照上面的規(guī)律,將對折0次到對折N次得到的面條數(shù)相加就是題目要求所得,而規(guī)律性的暴力題解,可以直接聯(lián)想到 [迭代] 和 [遞歸] 兩種方式
因?yàn)閺膶φ?次時(shí)才實(shí)際增加面條數(shù),所以遍歷次數(shù)從1開始,初始面條數(shù)為2
相對于迭代,遞歸的方式有時(shí)候可能會比較繞,比較難理解,這里先說下怎么去更好的理解遞歸,要怎么使用遞歸
遞歸三部曲
🍇代碼🍇
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. 大衍數(shù)列🍎
🍆題目 🍆
大衍數(shù)列規(guī)律如下:
例子:
0 2 4 8 12 18 24 32 40 50
🍆思路🍆
按照題目所給規(guī)律直接寫邏輯就好了
🍆代碼 🍆
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. 門牌制作🍅
🌸題目🌸
小藍(lán)要為街道的住戶制作門牌號,制作的方法為每個(gè)門的制作都會先將對應(yīng)的0~9這10個(gè)數(shù)字制作出來,然后再貼到門牌上
如果要為N位住戶制作門牌號,共需要制作多少個(gè)字符2?
🌸思路🌸
這實(shí)際上是一個(gè)求數(shù)值每一位上的數(shù)字問題,只需要從第一位住戶開始,統(tǒng)計(jì)對應(yīng)門牌號上數(shù)字2的位數(shù)的總和即可
🌸代碼🌸
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. 方陣轉(zhuǎn)置🥭
🌷題目🌷
給定一個(gè)NxM的矩陣,求它的轉(zhuǎn)置。
🌷思路🌷
轉(zhuǎn)置的思路很簡單,就是長變寬,寬變長
將原矩陣的N當(dāng)作轉(zhuǎn)置后的M,原矩陣的M當(dāng)作轉(zhuǎn)置后的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. 微生物增殖🍊
🌺題目🌺
假設(shè)有兩種微生物 X 和 Y
X出生后每隔3分鐘分裂一次(數(shù)目加倍),Y出生后每隔2分鐘分裂一次(數(shù)目加倍)。
一個(gè)新出生的X,半分鐘之后吃掉1個(gè)Y,并且,從此開始,每隔1分鐘吃1個(gè)Y。
現(xiàn)在已知有新出生的 X=10, Y=89,求60分鐘后Y的數(shù)目。
如果X=10,Y=90呢?
🌺思路🌺
題目給出三個(gè)關(guān)鍵信息
只要按照上面三個(gè)關(guān)鍵點(diǎn)進(jìn)行X和Y的數(shù)量計(jì)算即可,為了方便計(jì)算,關(guān)鍵信息[0.5 2 3]都擴(kuò)大兩倍為整型[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; }總結(jié)
以上是生活随笔為你收集整理的【Code Pratice】—— 切面条、大衍数列、门派制作、方阵转置、微生物繁殖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建系统|为何我坚持要用Python搭建
- 下一篇: C语言中将变量的数值打印到.txt文件