55 lines
1.4 KiB
SAS
55 lines
1.4 KiB
SAS
* Create a routine to generate the hailstone sequence for one number;
|
|
%macro gen_seq(n);
|
|
data hailstone;
|
|
array hs_seq(100000);
|
|
n=&n;
|
|
do until (n=1);
|
|
seq_size + 1;
|
|
hs_seq(seq_size) = n;
|
|
if mod(n,2)=0 then n=n/2;
|
|
else n=(3*n)+1;
|
|
end;
|
|
seq_size + 1;
|
|
hs_seq(seq_size)=n;
|
|
call symputx('seq_length',seq_size);
|
|
run;
|
|
|
|
proc sql;
|
|
title "First and last elements of Hailstone Sequence for number &n";
|
|
select seq_size as sequence_length, hs_seq1, hs_seq2, hs_seq3, hs_seq4
|
|
%do i=&seq_length-3 %to &seq_length;
|
|
, hs_seq&i
|
|
%end;
|
|
from hailstone;
|
|
quit;
|
|
%mend;
|
|
|
|
* Use the routine to output the first and last four numbers in the sequence for 27;
|
|
%gen_seq(27);
|
|
|
|
* Show the number less than 100,000 which has the longest hailstone sequence, and what that length is ;
|
|
%macro longest_hailstone(start_num, end_num);
|
|
data hailstone_analysis;
|
|
do start=&start_num to &end_num;
|
|
n=start;
|
|
length_of_sequence=1;
|
|
do while (n>1);
|
|
length_of_sequence+1;
|
|
if mod(n,2)=0 then n=n/2;
|
|
else n=(3*n) + 1;
|
|
end;
|
|
output;
|
|
end;
|
|
run;
|
|
|
|
proc sort data=hailstone_analysis;
|
|
by descending length_of_sequence;
|
|
run;
|
|
|
|
proc print data=hailstone_analysis (obs=1) noobs;
|
|
title "Number from &start_num to &end_num with longest Hailstone sequence";
|
|
var start length_of_sequence;
|
|
run;
|
|
%mend;
|
|
%longest_hailstone(1,99999);
|