检查数字是整数还是非整数

时间:2015-02-12 23:40:03

标签: clojure

如何测试数字并查看它是否为整数而不是非整数有理数?

扰流警告取自4clojure.com问题。

上下文

考虑这个功能:

(defn qux [n i]
  (reduce + (range 1 (/ n i))))

范围中的最后一个元素是小于n且可被i整除的正整数的数量。

user> (qux 10 3) ; 3, 6, & 9 are divisible by 3, sum(1, 2, 3) = 6
6
user> (qux 10 5) ; 5 is divisible by 5, sum(1) = 1
1

我想生成总和,而不生成范围。 sum(1..N) = N(N + 1)/2救援。 问题是N是一个严格小于n / i的最大整数。我的错误尝试是:

(defn how-many [n i] 
  (int (/ n i)))
(defn sum-1-to-N [n]
  (/ (* n (+ n 1)) 2))
(defn qux-prime [n i]
  (sum-1-to-N (how-many n i)))

user> (qux-prime 10 5)
3

所以我想测试(/ n i)的结果,如果是整数则减1,否则使用int截断。 (不使用floor,因为我不想导入整个数字塔,因为不知道如何在4clojure上做到这一点。)

3 个答案:

答案 0 :(得分:3)

您可以使用built-in integer? function

=> (integer? (/ 10 5)) ; true

这是一个完整的例子:

(defn qux-prime [n i]
  (let [r (/ n i)
        n (if (integer? r) (dec r) (int r))]
    (/ (* n (+ n 1)) 2)))

答案 1 :(得分:2)

我在另一个环境中遇到过这种情况,并发现

(if (== (int n) n) ; test to see if n is an integer - done this way (instead
   (do-if-true)    ;   of integer?) so that float integers will be detected 
   (do-if-false))  ;   correctly

运作良好。

分享并享受。

答案 2 :(得分:0)

有几个核心函数直接与整数一起工作,并且由于你的问题处理这些函数,它可能比依赖强制int函数好一点:

赋予qux

(defn qux2 [n i]
  (let [p (quot n i)
        q (if (zero? (rem n i)) (dec p) p)]
    (quot (* q (inc q)) 2)))

我用criterium

对其进行了修改
(require '[criterium.core :as c])
(let [p (rand-int 1000000)
      q (rand-int 10000)
      N 1000]
  (println "=========" p q)
  (c/quick-bench (dotimes [_ N] (qux p q)))
  (c/quick-bench (dotimes [_ N] (qux2 p q)))
  (c/quick-bench (dotimes [_ N] (qux-prime p q))))

在我的mbp上:

========= 364347 9361
...
             Execution time mean : 6.111392 ms [=> with reduce] 
...
             Execution time mean : 69.042004 µs [=> with quot, rem]
...
             Execution time mean : 294.989561 µs [=> with int, integer?]
...

在处理整数特定函数时,您可以获得显着的性能提升。