CCF-CSP 相反數
問題描述
試題編號:201403-1 試題名稱:相反數 時間限制:1.0s 記憶體限制:256.0MB 問題描述 有 N 個非零且各不相同的整數。請你編一個程式求出它們中有多少對相反數(a 和 -a 為一對相反數)。 輸入格式 第一行包含一個正整數 N。(1 ≤ N ≤ 500)。 第二行為 N 個用單個空格隔開的非零整數,每個數的絕對值不超過1000,保證這些整數各不相同。 輸出格式 只輸出一個整數,即這 N 個數中包含多少對相反數。 樣例輸入 5 1 2 3 -1 -2 樣例輸出 2
題解1
從第一個數開始,依次向後掃描,每次將該數與其之後的數相加,檢查和是不是 0,如果是則是相反數,否則不是。此外,要排除數字 0 的情況。樣例演示如下:
1+2,1+3,1+(-1),1+(-2) 判斷和是否為0
2+3,2+(-1),2+(-2) 判斷和是否為0
……依此類推
Python 程式碼實現:
n = int(input())# 獲取整數個數的輸入 a = list(map(int, input().split()))# 獲取輸入的n個整數 count = 0# 計數 for i in range(n - 1):# 按順序掃描 for j in range(i + 1, n): if a[i] != 0 and (a[i] + a[j] == 0):# 判斷是否是相反數 count = count + 1 print(count)# 輸出結果
題解2
利用集合中元素不同的性質,將原列表中的負數轉換成正數,將新的列表轉換成集合,然後用輸入的整數個數(原列表長度)減去集合的長度(去除相反數的列表長度)即為相反數的個數。
Python 程式碼實現:
n = int(input())# 獲取整數個數的輸入 a = list(map(int, input().split()))# 獲取輸入的n個整數 for x in range(b): a[x] = abs(a[x])# 負數轉正數 c = set(a)# 列表轉換成集合 print(n - len(c))# 得到相反數個數
題解3
題解 2 的另一種間接寫法,充分利用了map()
函式。Python 程式碼實現:
n = int(input()) a = list(map(int, input().split()))# 輸入轉化為列表 b = set(map(abs, a))# 各項取絕對值後轉化為集合,即除去相反的負數 print(n - len(b))# 原長度減去現長度,即被減去的相反數個數