Vielen Dank schon einmal für alle eingereichten Lösungen. Ich bin immer wieder faziniert auf wie viele unterschiedlichen Wegen sich das gleiche Problem lösen lässt und wie stark die einzelnen Lösungen untereinander abweichen.
Bei der ein oder anderen Lösung wäre ich auch froh, wenn ich nicht die Wartung für das Programm übernehmen müsste
Auch zieren die meisten Lösungen das SAS Log mit Typkonvertierungsnotes, da wohl an der ein oder anderen Stelle ein PUT/INPUT vergessen wurde.
Ich versuche mich daher einmal an einer "sauberen" Implementierung. Hier also mein Programm:
/* Parameters for program */
%let start_number = 1.89999e10; /* %let start_number = 1; */
%let end_number = 1.91e10; /* %let end_number = 2e10; */
%let divisor = 10;
/* define view with sum of digits */
data sum_of_digits_view/ view=sum_of_digits_view;
attrib number length=8 format=commax15.
sum_of_digits length=8;
keep number
sum_of_digits;
do number=&start_number. to &end_number.;
sum_of_digits = 0;
tmp_number = number;
do while(tmp_number ne 0);
sum_of_digits = sum_of_digits + mod(tmp_number, 10);
tmp_number = floor(tmp_number / 10);
end;
output;
end;
run;
/* data processing logic */
data _null_;
set sum_of_digits_view;
/* filter */
if (mod(sum_of_digits,&divisor.) eq 0);
length previous_number current_number 8;
retain previous_number 0;
/* check condition */
current_number = number;
if ( (current_number - previous_number) eq 1) then do;
put "NOTE: Zahlenpaar gefunden:";
put "NOTE- Zahl:" previous_number;
put "NOTE- Nachfolger:" current_number;
stop;
end;
previous_number = number;
/* report progress */
if (mod(_n_, 1000000) eq 0) then do;
progress = (current_number - &start_number.) / ( &end_number. - &start_number. );
rc = dosubl(cats('SYSECHO "progress:', put(progress, percent10.2), '";'));
end;
run;
Ich habe mein Programm logisch in zwei Teile geteilt. Im ersten Teil erzeuge ich eine Data View, die mir alle Zahlen im Suchraum sowie ihre Quersumme berechnet. Dieses Zwischenergebnis lässt sich auch schnell und einfach visuell "debuggen".
Im zweiten Teil wird im DATA _NULL_ Schritt die View verarbeitet und die Regeln der "Business Logik" geprüft.
Da bei einer vollständigen Suche ab der Zahl 1 die Verarbeitung relativ lange dauert, habe ich mir hier noch einenTrick abgeschaut: innerhalb des Datasteps melde ich noch an Enterprise Guide zurück, wie weit der aktuelle Verarbeitungsstand ist.
Viele Grüße,
Andreas
... View more