楼主: tangliang0905
3057 2

关于一个数字排列组合的问题 [推广有奖]

  • 1关注
  • 3粉丝

讲师

52%

还不是VIP/贵宾

-

威望
0
论坛币
1137 个
通用积分
0.5583
学术水平
13 点
热心指数
20 点
信用等级
11 点
经验
30311 点
帖子
212
精华
0
在线时间
836 小时
注册时间
2012-11-29
最后登录
2024-7-23

楼主
tangliang0905 发表于 2013-1-8 00:55:28 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
前不久看到有个小学生寒假作业,要在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;)但是发现这样的写法以后,得出的结果很奇怪,虽然得出的结果是错误的,但是我并不知道错误在哪里,所以还是请大牛们来指正一下)。


二维码

扫码加我 拉你入群

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

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

关键词:EFFICIENT delete output update Count

沙发
pobel 在职认证  发表于 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;
和谐拯救危机

藤椅
tangliang0905 发表于 2013-1-8 09:27:07
没错,谢谢指正

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 15:05