1.暴力枚舉
給定一個正整數n,請找出所有滿足a2 + b2 = n的整數對(a, b),其中a和b都是正整數,且a ≤ b。
輸入格式:一個正整數n (1 ≤ n ≤ 10?)
輸出格式:所有符合條件的(a, b)對,每行一對,按a的升序排列。如果沒有符合條件的對,輸出"No solution"。
問題分析:我們需要找到所有滿足a2 + b2 = n的正整數對(a, b),其中a ≤ b。
枚舉策略:由于a和b都是正整數且a ≤ b,a的最大可能值是√(n/2),因為如果a > √(n/2),那么a2 > n/2,b2 = n - a2 < n/2 < a2,這將導致b < a,與a ≤ b矛盾。
算法選擇:采用枚舉算法,遍歷a的所有可能取值,對于每個a,計算b2 = n - a2,然后檢查b是否為整數。
優化:在枚舉a時,只需要枚舉到√(n/2)即可,減少不必要的計算。
import mathdef find_num(n):result=[]max_a=math.isqrt(n//2) #計算n//2的整數平方根for a in range(1,max_a+1):remainder=n-a*ab=math.isqrt(remainder)if b*b==remainder and b>=a:result.append((a,b))return resultn=int(input("請輸入一個整數:"))
pairs=find_num(n)if not pairs:print("No solution")
else:for a,b in pairs:print(a,b)
input()
input()會
讀取用戶輸入的內容,并將其作為字符串返回。
例如,當用戶在控制臺輸入?3 1 4 1 5
?并按下回車鍵,input()
?就會返回字符串?"3 1 4 1 5"
。
2.快速排序
def quick_sort(arr):if len(arr)<=1:return arrelse:mid=arr[0]left=[x for x in arr[1:] if x<=mid]right=[x for x in arr[1:] if x>mid]return quick_sort(left)+[mid]+quick_sort(right)arr=list(map(int,input().split()))sorted_arr=quick_sort(arr)print(" ".join(map(str,sorted_arr)))
input().split()
split()
?會將一個字符串按照指定的分隔符(如果不指定分隔符,默認使用如空格作為分隔符)分割成多個子字符串,并返回一個包含這些子字符串的列表。
input().split()
?會把用戶輸入的字符串按空格分割成多個子字符串。
以上面的輸入?"3 1 4 1 5"
?為例,input().split()
?會返回?['3', '1', '4', '1', '5']
,注意這里列表中的元素仍然是字符串類型。
map(int, input().split())
map()
?接收兩個參數:一個函數和一個可迭代對象(如列表、元組等)。
map()
?函數會將傳入的函數應用到可迭代對象的每個元素上,并返回一個迭代器,這個迭代器中的元素是原可迭代對象元素經過函數處理后的結果。
list(map(int, input().split()))
list()
?是 Python 的內置函數,用于將一個可迭代對象轉換為列表。
Python 列表推導式(List Comprehension)?
列表推導式是一種簡潔的創建列表的方式,它允許你在一行代碼中生成一個新的列表。
[expression for item in iterable if condition]
left = [x for x in arr[1:] if x <= pivot]
" ".join(map(str, sorted_arr))
join()
?是字符串對象的一個方法,它的作用是將一個可迭代對象中的元素連接成一個字符串。調用該方法的空格字符串" "
?會作為連接這些元素的分隔符。
3.歸并排序
def merge(left, right):result = [] i = j = 0 while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i]) i = i + 1 else:result.append(right[j]) j = j + 1 while i < len(left):result.append(left[i])i = i + 1while j < len(right):result.append(right[j])j = j + 1return resultdef merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)weights = list(map(int, input().split()))sorted_weights = merge_sort(weights)print(" ".join(map(str, sorted_weights)))
4.桶排序
input_str = input()# 初始化桶
buckets = [0] * 26for char in input_str:# 計算字符對應的桶索引index = ord(char) - ord('a')buckets[index] += 1# 遍歷 26 個桶
for i in range(26):# 如果桶中的計數不為 0,說明該字符出現過if buckets[i] > 0:# 根據索引計算對應的字符char = chr(i + ord('a'))# 輸出字符及其出現次數print(f"{char}: {buckets[i]}")