題意描述:
當自然數 n 依次取 1、2、3、……、n 時,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少個不同的值?(注:⌊x⌋ 為取整函式,表示不超過 x 的最大自然數,即 x 的整數部分。)
輸入格式:
輸入給出乙個正整數 n(2≤n≤10^4 )。
輸出格式:
在一行中輸出題面中算式取到的不同值的個數。
輸入樣例:
2017
輸出樣例:
1480
解題思路:
alice: 這道題看起來有點熟悉呀。
bob: 題目做的多了,翻來覆去也就這麼多型別了。
alice: 這題是要去重啊,直接順著題目的邏輯來就行了,遍歷,求值,用set去重,最後輸出集合的大小。
bob: 嘿,咱倆想的一模一樣啊。
alice: 現在覺得那句「人生苦短,我用python」還是有些道理的。python中很多內建物件型別真的是使用頻率很高的啊。比如說set( )
bob: 是啊,c++的話還要再使用模板庫。不過這道題目不用
set
也能做,就是麻煩一點。
alice: 不用set
⊙(・◇・)?用陣列重複打標記,最後在把有標記的值找出來?
bob: 對呀對呀,~ ( ̄▽ ̄)~*
**:
def
main()
: n =
int(
input()
)# 接收輸入的整數n
values =
set(
)# values是乙個集合,用來儲存所有的不同的值
for x in
range(1
, n +1)
:# 當自然數x依次取1 2 3 ... n時
values.add(
int(x /2)
+int
(x /3)
+int
(x /5)
)# 將算式不同的值新增到values當中,由於集合中元素的唯一性,相同的值將只被記錄一次
print
(len
(values)
)# 由於集合中的每個元素都是唯一的,所以集合大小就是不同取值的個數
if __name__ ==
'__main__'
: main(
)
#include
#define nn 10334
// 為什麼是10334 ? 因為 10000 / 2 + 10000 / 3 + 10000 / 5 == 10333.3333...
int flags[nn]
;// 我們使用flags來儲存所有不同算式的值,如某個算式的值是0,就有flags[0] == 1
intmain()
int count =0;
// 計算共有多少個不同的值出現
for(
int i=
0; i < nn;
++i)
}printf
("%d\n"
, count)
;// 輸出共有多少個不同的值
return0;
}
#include
#include
// 使用c++模板set需要先包含此檔案
using namespace std;
// 同樣需要宣告命名空間
intmain()
printf
("%d\n"
, values.
size()
);// 由於集合的特性,集合中沒有重複的元素存在,所以集合的大小就是不同值的個數
return0;
}
易錯點:
總結:
1087 有多少不同的值 20 分
當自然數 n 依次取 1 2 3 n 時,算式 n 2 n 3 n 5 有多少個不同的值?注 x 為取整函式,表示不超過 x 的最大自然數,即 x 的整數部分。輸入給出乙個正整數 n 2 n 10 4 在一行中輸出題面中算式取到的不同值的個數。20171480 include includeusin...
1087 有多少不同的值 20分
當自然數 n 依次取 1 2 3 n 時,算式 n 2 n 3 n 5 有多少個不同的值?注 x 為取整函式,表示不超過 x 的最大自然數,即 x 的整數部分。輸入格式 輸入給出乙個正整數 n 2 n 10 4 輸出格式 在一行中輸出題面中算式取到的不同值的個數。輸入樣例 2017輸出樣例 1480...
1087 有多少不同的值
1087 有多少不同的值 20 分 當自然數 n 依次取 1 2 3 n 時,算式 n 2 n 3 n 5 有多少個不同的值?注 x 為取整函式,表示不超過 x 的最大自然數,即 x 的整數部分。輸入給出乙個正整數 n 2 n 10 4 在一行中輸出題面中算式取到的不同值的個數。20171480 i...