Factors of an integer: Difference between revisions

From Rosetta Code
Content added Content deleted
(Flag for correction, add clarifying WP link)
Line 2: Line 2:
[[Category:Arithmetic operations]]
[[Category:Arithmetic operations]]
[[Category:Mathematical_operations]]
[[Category:Mathematical_operations]]
Compute the factors of a number.
Compute the [[wp:Divisor|factors]] of a number.


See also [[Prime decomposition]]
See also [[Prime decomposition]]


=={{header|Clojure}}==
=={{header|Clojure}}==
{{incorrect|Clojure|It needs to include the number itself in the list of factors; right now it is only producing the '''proper divisors''' of the number, which is not quite right.}}

<lang lisp>(defn factors [n]
<lang lisp>(defn factors [n]
(filter #(zero? (rem n %)) (range 1 n)))
(filter #(zero? (rem n %)) (range 1 n)))

Revision as of 06:01, 16 August 2009

Task
Factors of an integer
You are encouraged to solve this task according to the task description, using any language you may know.

Basic Data Operation
This is a basic data operation. It represents a fundamental action on a basic data type.

You may see other such operations in the Basic Data Operations category, or:

Integer Operations
Arithmetic | Comparison

Boolean Operations
Bitwise | Logical

String Operations
Concatenation | Interpolation | Comparison | Matching

Memory Operations
Pointers & references | Addresses

Compute the factors of a number.

See also Prime decomposition

Clojure

This example is incorrect. Please fix the code and remove this message.

Details: It needs to include the number itself in the list of factors; right now it is only producing the proper divisors of the number, which is not quite right.

<lang lisp>(defn factors [n] (filter #(zero? (rem n %)) (range 1 n)))

(print (factors 45))</lang>

(1 3 5 9 15)

Python

<lang python>>>> def factors(n): return [i for i in range(1,n//2) if not n%i] + [n]

>>> factors(45) [1, 3, 5, 9, 15, 45]</lang>

Ruby

<lang ruby>class Integer

 def factors() (1..self).select { |n| (self % n).zero? } end

end p 45.factors</lang>

[1, 3, 5, 9, 15, 45]

As we only have to loop up to , we can write <lang ruby>class Integer

 def factors()
   1.upto(Math.sqrt(self)).select {|i| (self % i).zero?}.inject([]) do |f, i| 
     f << i
     f << self/i unless i == self/i
     f
   end.sort
 end

end [45, 53, 64].each {|n| p n.factors}</lang> output

[1, 3, 5, 9, 15, 45]
[1, 53]
[1, 2, 4, 8, 16, 32, 64]

Tcl

<lang tcl>proc factors {n} {

   set factors {}
   for {set i 1} {$i <= sqrt($n)} {incr i} {
       if {$n % $i == 0} {
           lappend factors $i [expr {$n / $i}]
       }
   }
   return [lsort -unique -integer $factors]

} puts [factors 64] puts [factors 45] puts [factors 53]</lang> output

1 2 4 8 16 32 64
1 3 5 9 15 45
1 53