全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3012 2
2013-01-08
前不久看到有个小学生寒假作业,要在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;)但是发现这样的写法以后,得出的结果很奇怪,虽然得出的结果是错误的,但是我并不知道错误在哪里,所以还是请大牛们来指正一下)。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-1-8 09:09:30
data A 那一步:
DATA A;
DO I=1078 TO 2345;
I2=I*4;
A1=FLOOR(I/1000);
A2=FLOOR((I-A1*1000)/100);
A3=FLOOR((I-A1*1000-A2*100)/10);
A4=I-A1*1000-A2*100-A3*10;

A5=FLOOR(I2/1000);
A6=FLOOR((I2-A5*1000)/100);
A7=FLOOR((I2-A5*1000-A6*100)/10);
A8=I2-A5*1000-A6*100-A7*10;

CALL SORTN (OF A1-A8);
A=PUT(STRIP(CATT(OF A1-A8)),8.);
OUTPUT;
END;
RUN;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-8 09:27:07
没错,谢谢指正
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群