本題要求你從任意給定的兩個 1 位數字 a1? 和 a2? 開始,用乘法口訣生成一個數列 {an?},規則為從 a1? 開始順次進行,每次將當前數字與后面一個數字相乘,將結果貼在數列末尾。如果結果不是 1 位數,則其每一位都應成為數列的一項。
輸入格式:
輸入在一行中給出 3 個整數,依次為 a1?、a2? 和 n,滿足 0≤a1?,a2?≤9,0<n≤103。
輸出格式:
在一行中輸出數列的前 n 項。數字間以 1 個空格分隔,行首尾不得有多余空格。
輸入樣例:
2 3 10
輸出樣例:
2 3 6 1 8 6 8 4 8 4
樣例解釋:
數列前 2 項為 2 和 3。從 2 開始,因為 2×3=6,所以第 3 項是 6。因為 3×6=18,所以第 4、5 項分別是 1、8。依次類推…… 最后因為第 6 項有 6×8=48,對應第 10、11 項應該是 4、8。而因為只要求輸出前 10 項,所以在輸出 4 后結束。
# 讀取輸入的 a1, a2 和 n
a1, a2, n = map(int, input().split())# 特殊情況處理:如果 n 為 1,直接輸出 a1
if n == 1:print(a1)
# 如果 n 為 2,直接輸出 a1 和 a2
elif n == 2:print(f"{a1} {a2}")
else:# 初始化數列,包含前兩項sequence = [a1, a2]# 用于記錄當前參與乘法運算的索引index = 0# 當數列長度小于 n 時,繼續生成新的項while len(sequence) < n:# 計算當前兩項的乘積product = sequence[index] * sequence[index + 1]# 將乘積轉換為字符串,方便按位處理product_str = str(product)# 遍歷乘積的每一位for digit in product_str:# 將每一位數字添加到數列中sequence.append(int(digit))# 如果數列長度達到 n,停止添加if len(sequence) == n:break# 移動到下一組參與乘法運算的項index += 1# 輸出數列的前 n 項,用空格分隔print(" ".join(map(str, sequence)))
綜上所述,這段代碼通過對?n
?的不同情況進行處理,實現了根據給定的前兩項?a1
?和?a2
?生成乘法口訣數列并輸出前?n
?項的功能。
temp[++temp_len] = 0;前置自增運算符?++
?會先將?temp_len
?的值加?1
,然后返回加?1
?后的值。將數字?0
?賦值給?temp[1]
,即?temp[1] = 0;
temp[temp_len++] = 0;由于后置自增操作符?++
?的特性,它會先返回?temp_len
?的當前值,然后再將?temp_len
?的值加?1
。將數字?0
?賦值給?temp[0]
,即?temp[0] = 0;
input()
:這是 Python 的內置函數,用于從標準輸入(通常是鍵盤)讀取用戶輸入的一行內容,返回的是一個字符串。split()
:字符串對象的方法,用于將字符串按空格分割成多個子字符串,并返回一個包含這些子字符串的列表。例如,若用戶輸入?2 3 10
,input().split()
?會得到?['2', '3', '10']
。map(int, ...)
:map
?函數會將?int
?這個函數應用到傳入的可迭代對象(這里是?input().split()
?返回的列表)的每個元素上,將列表中的每個字符串元素轉換為整數。所以?map(int, input().split())
?會把?['2', '3', '10']
?轉換為包含整數?2
、3
?和?10
?的一個可迭代對象。a1, a2, n = ...
:使用解包賦值,將可迭代對象中的三個整數分別賦值給變量?a1
、a2
?和?n
。其中?a1
?和?a2
?是數列的前兩項,n
?是需要輸出的數列項數。if n == 1:
:判斷?n
?是否等于 1,如果是,則直接使用?print
?函數輸出?a1
,因為此時只需要輸出數列的第一項。elif n == 2:
:如果?n
?不等于 1,繼續判斷?n
?是否等于 2。如果是,則使用 f-string 格式化字符串,將?a1
?和?a2
?用空格連接起來并輸出,這是因為此時需要輸出數列的前兩項。else:
:如果?n
?既不等于 1 也不等于 2,說明需要按照常規邏輯生成數列。sequence = [a1, a2]
:初始化一個列表?sequence
,并將?a1
?和?a2
?作為列表的前兩個元素,這個列表用于存儲生成的數列。index = 0
:初始化一個變量?index
?為 0,用于記錄當前參與乘法運算的元素在?sequence
?列表中的索引。while len(sequence) < n:
:使用?while
?循環,只要?sequence
?列表的長度小于?n
,就繼續循環,以不斷生成新的數列項。product = sequence[index] * sequence[index + 1]
:計算?sequence
?列表中當前索引?index
?對應的元素和下一個元素的乘積,將結果存儲在?product
?變量中。product_str = str(product)
:將乘積?product
?轉換為字符串類型,這樣可以方便地按位處理。for digit in product_str:
:遍歷乘積字符串?product_str
?中的每一個字符。sequence.append(int(digit))
:將遍歷到的字符轉換為整數,并添加到?sequence
?列表的末尾。if len(sequence) == n:
:判斷?sequence
?列表的長度是否達到了?n
,如果達到了,則使用?break
?語句跳出內層的?for
?循環,停止添加新元素。index += 1
:將?index
?加 1,以便在下一次循環中計算下一組相鄰元素的乘積。print(" ".join(map(str, sequence)))
:使用?map(str, sequence)
?將?sequence
?列表中的每個整數元素轉換為字符串,然后使用?" ".join(...)
?方法將這些字符串用空格連接起來,最后使用?print
?函數輸出連接后的字符串。
可以將 `int temp[4];` 改為 `int temp[3];`。下面來詳細分析原因:### 數組用途分析
在代碼里,`temp` 數組的作用是臨時存儲兩個一位數相乘結果的每一位數字。由于輸入的 `a1` 和 `a2` 滿足 `0 ≤ a1, a2 ≤ 9`,那么它們相乘的結果范圍是 `0` 到 `81`(`9 * 9 = 81`)。### 結果位數分析
- 當乘積為 `0` 時,結果是一位數。
- 當乘積在 `1` 到 `9` 之間時,結果同樣是一位數。
- 當乘積在 `10` 到 `81` 之間時,結果是兩位數。所以,兩個一位數相乘的結果最多是兩位數,再考慮到可能為 `0` 這種特殊情況,存儲乘積每一位數字最多需要 `3` 個元素的數組就足夠了,即 `int temp[3];` 是可行的。### 代碼修改示例
以下是將 `int temp[4];` 改為 `int temp[3];` 后的完整代碼:
```c
#include <stdio.h>#define MAX_N 1000int main() {int a1, a2, n;// 讀取輸入的 a1, a2 和 nscanf("%d %d %d", &a1, &a2, &n);int sequence[MAX_N];// 初始化數列的前兩項sequence[0] = a1;sequence[1] = a2;int len = 2; // 當前數列的長度int index = 0; // 用于記錄當前參與乘法運算的索引// 當數列長度小于 n 時,繼續生成新的項while (len < n) {int product = sequence[index] * sequence[index + 1];int temp[3]; // 臨時存儲乘積的每一位數字,因為最大 9*9 = 81,最多兩位int temp_len = 0;// 處理乘積的每一位if (product == 0) {temp[temp_len++] = 0;} else {while (product > 0) {temp[temp_len++] = product % 10;product /= 10;}}// 反轉存儲的數字,使其順序正確for (int i = temp_len - 1; i >= 0; i--) {sequence[len++] = temp[i];if (len == n) {break;}}index++;}// 輸出數列的前 n 項,用空格分隔for (int i = 0; i < n; i++) {if (i > 0) {printf(" ");}printf("%d", sequence[i]);}printf("\n");return 0;
}
```
這樣修改之后,代碼的功能不會受到影響,同時還能減少不必要的內存開銷。
vector
?是 C++ 標準模板庫(STL)中的一個容器類,它表示一個動態數組。與傳統的 C 數組相比,vector
?具有以下優點:
- 動態大小:
vector
?可以在運行時動態地改變其大小,你可以根據需要添加或刪除元素,而不需要在創建時指定固定的大小。 - 自動內存管理:
vector
?會自動管理其內部的內存,當元素數量增加時,它會自動分配更多的內存;當元素數量減少時,它會自動釋放不再使用的內存,避免了手動管理內存帶來的復雜性和潛在的內存泄漏問題。 - 豐富的操作方法:
vector
?提供了一系列方便的成員函數,如?push_back()
?用于在末尾添加元素、pop_back()
?用于刪除末尾元素、size()
?用于獲取元素數量等,使對數組的操作更加方便和高效。