前不久看到有个小学生寒假作业,要在12345678这八个数字中选取一个4个数字作为一个四位数,剩下的四个数字成为另外一个四位数,要求第二个四位数是第一个的四倍。
我觉得就直接用最直接的SAS code来运算
DATA A;
DO I=1078 TO 2345;
I2=I*4;
A1=FLOOR(I/1000);
A2=FLOOR(I-A1*1000);
A3=FLOOR(I-A1*1000-A2*100);
A4=I-A1*1000-A2*100-A3*10;
A5=FLOOR(I2/1000);
A6=FLOOR(I2-A5*1000);
A7=FLOOR(I2-A5*1000-A6*100);
A8=I2-A5*1000-A6*100-A7*10;
CALL SORTN (OF A1-A8);
A=PUT(STRIP(CATT(OF A1-A8),$8.);
OUTPUT;
END;
RUN;
DATA A2;
SET A;
IF A='12345678';
RUN;
后来我又想如果是从0123456789这十个数字中抽出八个数字组成两个四位数,并且第二个是第一个的四倍的话,
那么程序应该是大同小异,只不过最后组成的那个字符串,应该其中不出现重复的数字,我只能用count语句来写,
DATA A2;
SET A;
IF COUNT(A,'0')>1 THEN DELETE;
ELSE IF COUNT(A,'1')>1 THEN DELETE;
ELSE IF COUNT(A,'2')>1 THEN DELETE;
ELSE IF COUNT(A,'3')>1 THEN DELETE;
ELSE IF COUNT(A,'4')>1 THEN DELETE;
ELSE IF COUNT(A,'5')>1 THEN DELETE;
ELSE IF COUNT(A,'6')>1 THEN DELETE;
ELSE IF COUNT(A,'7')>1 THEN DELETE;
ELSE IF COUNT(A,'8')>1 THEN DELETE;
ELSE IF COUNT(A,'9')>1 THEN DELETE;
RUN;
当然取值范围应该从原来的范围变成 i=1023 to 2498
但是我总觉得这两段code都不是特别的efficient,所以想要来抛砖引玉,和大家一起来共同探讨这个问题,谢谢
UPDATE:
关于第二段code又有一个新的想法,
DATA A3;
SET A;
ARRAY B[8] A1-A8;
DO X=1 TO 8;
DO Y = I+1 TO 8;
IF B{X} = B{Y} THEN DELETE;
END;
END;
RUN;
(其实我一开始是想写 IF B{X} = B{Y} THEN mark=1 else mark=0;)但是发现这样的写法以后,得出的结果很奇怪,虽然得出的结果是错误的,但是我并不知道错误在哪里,所以还是请大牛们来指正一下)。