用尤拉計劃題目來學q語法

lt發表於2016-06-27

題目1:找出1000以下自然數中3和5的倍數之和。
10以下的自然數中,屬於3和5的倍數的有3,5,6和9,它們之和是23.
找出1000以下的自然數中,屬於3和5的倍數的數字之和。

思路1:
逐個列舉,判斷,累加。

q)s:0
q)do[n:999;if[0=(n mod 3) &(n mod 5);s:s+n];n:n-1] //這裡&符號表示求最小值
q)s
233168

思路2: 利用等差數列和的公式。
3的倍數+5的倍數-15的倍數。

q)f:{"j"$(x+x*floor 999%x)*(floor 999%x)%2}  //"j"$將結果用長整數表示
q)f[3]+f[5]-f[15]
233168

思路3:
篩法,第1次掃描,標出所有3的倍數,第2次,標出所有5的倍數。最後,將標記的數累加。

q)d:(3 5) //要求的倍數的列表
q)a:1+til 1000 //初始化1000個數,第一個位置(索引下標為0)空著不用。
q)do[k:count d;k:k-1;do[n:floor 999%d[k];a[d[k]*n]:0;n:n-1]] //把a中的元素是d列表元素的倍數的位置置0
q)s:0
q)do[n:1000;n:n-1;if[0=a[n];s:s+n]] //累計
q)s
233168

大神的思路:

sum w where n>=w:asc distinct raze (1+til n:999)*/:3 5 //raze把多層展平為1層
sum asc distinct  raze l*1+til each -1 + ceiling n:1000 %l:3 5

相關文章