[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