BookmarkSubscribeRSS Feed
rajeshalwayswel
Pyrite | Level 9

How to pick prime,even and odd numbers using datasteps and do loops? Atleast 0 to 50?

6 REPLIES 6
Kurt_Bremser
Super User

For odd/even use the mod() function.

For prime numbers I'd use an array and do something like

array primes{50} 1;
do i1 = 2 to 50;
  if primes{i1}
  then do;
    i2 = 2 * i1;
    do while (i2 lt 50);
      primes{i2} = 0;
      i2 + i1;
    end;
  end;
end;

After that, all elements where the index is a prime number contain a 1.

You can replace all 50's with a macro variable to make the code flexible.

rajeshalwayswel
Pyrite | Level 9
When I exceute the code we have missing values in the dataset..array primes{50} 1; when we using 1 in this place I'm getting error...Is any thing need to change in it..

ChrisNZ
Tourmaline | Level 20

A working version of the program from @Kurt_Bremser.

 

       
data _null_;
  array PRIMES{1:50} (50*1);
  do I1 = 2 to 50;              
    if PRIMES{I1} then do;
      I2 = 2 * I1;              
      do while (I2 lt 50);
        PRIMES{I2} = 0;        putlog I1= I2= PRIMES[I2]=;
        I2 + I1;
      end;
    end;
  end;
run;

which is a slightly more efficient version of 


data _null_;
  array PRIMES{1:50} (50*1);
  do I1 = 2 to 50;              
    do I2 = I1 to 50/I1;              
      PRIMES{I1*I2} = 0;        putlog I1= I2= PRIMES[I1*I2]=;
    end;
  end;
run;

I added the intermediate values in the log for you to see the logic.

Note that Kurt's loops need to be tweaked at bit as they flag 50 as a prime.

 

 

 

 

Kurt_Bremser
Super User

my initial code was written without access to SAS from @home, therefore the "something like". It was meant to show the basic algorithm for creating Eratosthenes's sieve.

A working version (syntactically and semantically, thanks to @ChrisNZ😞

data primes (keep=primenumber);
array primes{50} 3 _temporary_ (50*1);
do i1 = 2 to 50;
  if primes{i1}
  then do;
    i2 = 2 * i1;
    do while (i2 le 50);
      primes{i2} = 0;
      i2 + i1;
    end;
  end;
end;
do primenumber = 1 to 50;
  if primes{primenumber} then output;
end;
run;
librasonali
Quartz | Level 8
Hi Chris !!
can you please explain me below logic from your code ??
do I2 = I1 to 50/I1;

thanks in advance !!! 🙂
How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 7247 views
  • 0 likes
  • 5 in conversation