For problem 4 in the euler project part of the assignment is to generate a list of products of 3-digit numbers.
The easy way is to just do a cartesian product (I think it's called), and after that find the largest value that is a palindrome.
My question is, is it possible to generate a list of pairs of which the product is ordered?
For example with 2-digits:
99,99
99,98
98,98
99,97
98,97
etc..
My attempt is (in haskell):
productsOf2Digits = productsOf2Digits' 99 99
productsOf2Digits' 90 90 = (90,90, 90*90) : []
productsOf2Digits' a b | a == b = (a,b,a*b) : productsOf2Digits' 99 (b-1)
| otherwise = (a,b,a*b) : productsOf2Digits' (a-1) b
Which yields:
(99,99,9801)
(99,98,9702)
(98,98,9604)
(99,97,9603)
(98,97,9506)
(97,97,9409)
(99,96,9504)
(98,96,9408)
(97,96,9312)
(96,96,9216)
The pair 99 96 breaks the ordering.
I think maybe I can exploit that the differences should be increasing?
Also, might it have to do with? http://www.cs.ox.ac.uk/people/jeremy.gibbons/publications/rationals.pdf
Here's a piece of C++ code for you.
The idea is to have a queue containing one item for each column (thing with same
xvalue). Initially they all start of at they=99row. In each iteration, the maximal item is taken from the queue, and the item one below that added instead, unless doing so would leave the range of pairs we're interested in. In this case the range is 1 ≤ x ≤ y ≤ 99 but I'm printing y first to match your lists.