*step2:创造算法表达式;
proc sql noprint;
create table c as select * from b1,b2,b3,b4,b5,b6,b7,b8,b9;
quit;
data d;
set c;
seq = _n_;
list = x1||x2||x3||x4||x5||x6||x7||x8||x9;
list = compress(list);
run;
*step3:计算算法表达式;
data e;
set d end = last;
call symput('list'||left(_n_),list);
if last then call symput('count',_n_);
run;
%macro f1;
data f;
%do i = 1 %to &count;
seq = &i;
result = %eval(&&list&i);
output;
%end;
run;
%mend;
%f1;
*step4:统计计算结果;
proc sort data = d; by seq; run;
proc sort data = f; by seq; run;
data g;
merge d f;
run;
proc summary data = g nway missing;
class result;
var seq;
output out = h(drop = _type_ seq) sum=;
run;
*step5:验证计算结果;
data g100;
set g;
if result eq 100;
run;
ps:step2 里面的sql步看到了ahuige的影子,step3里面的%eval函数看到了qkaiwei的影子。作者: shiyiming 时间: 2010-4-26 09:51 标题: Re: 求1到9数字加减算法的个数? [code:15xdpskz]%MACRO OUTmcr;
%LOCAL I;
IF I = 1 THEN OUTPUT A1; %DO I = 2 %TO 9; ELSE IF I = &I THEN OUTPUT A&I; %END;
%MEND OUTmcr;
DATA A1 A2 A3 A4 A5 A6 A7 A8 A9; /*L-digits, S-sign*/
DO I = 1 TO 9;
DO K = I TO 9;
X = I*10**(9-K); L = 10-K; S = SIGN(X); %OUTMCR
X = -I*10**(9-K); L = 10-K; S = SIGN(X); %OUTMCR
END;
END;
DROP I K;
RUN;
%MACRO SQLmcr;
%LOCAL I K II;
PROC SQL;
CREATE TABLE ALL AS
%DO I = 8 %TO 2 %BY -1;
SELECT DISTINCT %DO K = 1 %TO &I %BY 1; X&K, %END; A%EVAL(&I+1).X AS X%EVAL(&I+1), A%EVAL(&I+1).S AS S, A%EVAL(&I+1).L AS L FROM(
%END;
SELECT DISTINCT A1.X AS X1, A2.X AS X2, A2.S AS S, A2.L AS L FROM A1, A2
WHERE ((A1.L = 1) OR (A1.S = A2.S AND A1.L = A2.L+1) OR (A1.S ^= A2.S AND A1.L = 1))) AS T3, A3
%DO II = 3 %TO 8 % BY 1;
WHERE ((T&II..L = 1) OR (T&II..S = A&II..S AND T&II..L = A&II..L+1) OR (T&II..S ^= A&II..S AND T&II..L = 1))) AS T%EVAL(&II+1), A%EVAL(&II+1)
%END;
WHERE ((T9.L = 1) OR (T9.S = A9.S AND T9.L = A9.L-1) OR (T9.S ^= A9.S AND T9.L = 1));
QUIT;
%MEND SQLmcr;
%SQLmcr
;
DATA ALL; SET ALL;
SUM= SUM(OF X1-X9);
RUN;
PROC FREQ; WHERE SUM BETWEEN 0 AND 100;
TABLES SUM/NOPERCENT;
RUN;[/code:15xdpskz]