MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

[Fwd: Selecting numbers with all odd digits]

  • To: mathgroup at smc.vnet.net
  • Subject: [mg22274] [Fwd: [mg22170] Selecting numbers with all odd digits]
  • From: Hartmut Wolf <hwolf at debis.com>
  • Date: Mon, 21 Feb 2000 20:00:42 -0500 (EST)
  • Organization: debis Systemhaus
  • Sender: owner-wri-mathgroup at wolfram.com

Hartmut Wolf schrieb:
 
 Tom De Vries schrieb:
 >
 > Hello all,
 >
 > In one of the math classes I am teaching we are doing some work with
 > permutations and combinations.  One question in the text was,  "how many
 > positive integers less than 700 have all odd digits?"
 >
 > I had done the question "by hand" and then wondered how to use Mathematica
 > to demonstrate that the solution was the correct one.
 >
 > I am still very far down on the learning curve in most things, but I managed
 > to bludgeon my way to an answer  (thankfully the same as mine!)
 >
 > Select[
 >
 >   Range[699],
 >
 >   Union[ OddQ [ IntegerDigits[#]]] == {True} &
 >
 >   ]
 >
 > I am sure my trial and error method can be improved upon.  I am not talking
 > speed as much as simply using Mathematica in a way that makes sense and
 > would be more logical??
 >
 
 Hello Tom,
 
 as for the programming, your
 
 In[1]:= Select[Range[699], Union[OddQ[IntegerDigits[#]]] == {True} &] //
 Length
 Out[1]= 105
 
 is equivalent to
 
 In[2]:= Count[Range[699], _?(And @@ OddQ[IntegerDigits[#]] &)]
 Out[2]= 105
 
 So this counts all Integers in the specified range for that all digits
 are odd -- literal Translation. But you also could calculate simply
 
 In[3]:= 5^^300 + 5^^100 + 5^^10
 Out[3]= 105
 
 or if you prefer
 
 In[4]:= 3 5 5 + 5 5 + 5
 Out[4]= 105
 
 The example is somewhat very special, perhaps tricking.  Better try to
 solve the general case "by hand". After the experience with that you
 might end up with that algorithm:
 
 caodd3[n_Integer?Positive] :=
   Block[{aodd = True,
     f = #1*5 + If[aodd, If[OddQ[#2], (#2 + 1)/2,
          aodd = False; #2/2], 5] & },
    Fold[f, 0, IntegerDigits[n]]]
 
 In[9]:= caodd3[699]
 Out[9]= 105
 
 To give you a hint how I discovered this, I took the arbitrary number
 13461:
 
 (1)   caodd[13461] ==  caodd[13399]
 
 (2)       1_3_3_9_9
 
           1 5 5 5 5 +
             2 5 5 5 +
               2 5 5 +
                 5 5 +
                   5
 
 The new algorithm has quite a different efficiency. Compare with
 
 caodd2[n_Integer?Positive] :=
   Count[Range[n], _?(And @@ OddQ[IntegerDigits[#]] &)]
 
 In[13]:= caodd2[315225] // Timing
 Out[13]= {101.816 Second, 7305}
 
 In[14]:= caodd3[315225] // Timing
 Out[14]= {0.01 Second, 7305}
 
 Kind regards, Hartmut



  • Prev by Date: Re: Re: export graphics
  • Next by Date: J/Link preview release
  • Previous by thread: Q: pattern and simplify
  • Next by thread: J/Link preview release