SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 963|回复: 6
打印 上一主题 下一主题

求1到9数字加减算法的个数?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-4-23 12:33:12 | 只看该作者

求1到9数字加减算法的个数?

从1到9的数字序列,要求:不改变数字顺序;在数字中添加+-号,得一固定数值;
比如100=123+45-67+8—9
            =—1+2—3+4+5+6+78+9
           =123 +4—5+67—89
     。。。。。。。
等于100的话共有12种算法,
要求编程求等于固定数值的算法的数目。
比如值等于1的有43种算法,等于2的有18中算法,等于99的有25中算法。。。。等于100的有12中算法。

全排列 <!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o -->    大家可有精巧的代码?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-4-23 19:19:47 | 只看该作者

Re: 求1到9数字加减算法的个数?

写了两种方法,留给自己了,嘿嘿!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-4-24 10:51:30 | 只看该作者

Re: 求1到9数字加减算法的个数?

<!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->  !!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-4-24 12:24:14 | 只看该作者

Re: 求1到9数字加减算法的个数?

<!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( --> 完了,这回连站内信都没了...
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-4-24 13:11:47 | 只看该作者

Re: 求1到9数字加减算法的个数?

嗯,这个题目有点意思,发表一个抛砖引玉啊,写的虽然长了点,但感觉思路还算可以,哈哈

结果放在work库的数据集h中。

[code:3bpzto7w]

*step1&#58;准备基础数据;
data b1(keep = x1) b2(keep = x2) b3(keep = x3) b4(keep = x4) b5(keep = x5)
     b6(keep = x6) b7(keep = x7) b8(keep = x8) b9(keep = x9) ;
     input x1&#58;$2&#46; x2&#58;$2&#46; x3&#58;$2&#46; x4&#58;$2&#46; x5&#58;$2&#46; x6&#58;$2&#46; x7&#58;$2&#46; x8&#58;$2&#46; x9&#58;$2&#46;;
     cards;
     1 2 3 4 5 6 7 8 9
     -1 -2 -3 -4 -5 -6 -7 -8 -9
     +1 +2 +3 +4 +5 +6 +7 +8 +9
     ;
run;
*首位添“+”与“空”是等价行为,故取其一即可;
data b1;
     set b1;
     if _n_ eq 3 then delete;
run;


*step2&#58;创造算法表达式;
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&#58;计算算法表达式;
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 &amp;count;
    seq = &amp;i;
    result = %eval(&amp;&amp;list&amp;i);
    output;
    %end;
run;
%mend;
%f1;

*step4&#58;统计计算结果;
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&#58;验证计算结果;
data g100;
     set g;
     if result eq 100;
run;

[/code:3bpzto7w]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-4-24 16:33:26 | 只看该作者

Re: 求1到9数字加减算法的个数?

这个算法不错,谢谢!

ps:step2 里面的sql步看到了ahuige的影子,step3里面的%eval函数看到了qkaiwei的影子。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-4-26 09:51:32 | 只看该作者

Re: 求1到9数字加减算法的个数?

[code:15xdpskz]%MACRO OUTmcr;
        %LOCAL I;
        IF I = 1 THEN OUTPUT A1; %DO I = 2 %TO 9; ELSE IF I = &amp;I THEN OUTPUT A&amp;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 &amp;I %BY 1; X&amp;K, %END; A%EVAL(&amp;I+1)&#46;X AS X%EVAL(&amp;I+1), A%EVAL(&amp;I+1)&#46;S AS S,  A%EVAL(&amp;I+1)&#46;L AS L FROM(
                        %END;
                                SELECT DISTINCT A1&#46;X AS X1, A2&#46;X AS X2,  A2&#46;S AS S, A2&#46;L AS L FROM A1, A2
                                        WHERE ((A1&#46;L = 1) OR (A1&#46;S = A2&#46;S AND A1&#46;L = A2&#46;L+1) OR (A1&#46;S ^= A2&#46;S AND A1&#46;L = 1))) AS T3, A3
                                %DO II = 3 %TO 8 % BY 1;
                                        WHERE ((T&amp;II&#46;&#46;L = 1) OR (T&amp;II&#46;&#46;S = A&amp;II&#46;&#46;S AND T&amp;II&#46;&#46;L = A&amp;II&#46;&#46;L+1) OR (T&amp;II&#46;&#46;S ^= A&amp;II&#46;&#46;S AND T&amp;II&#46;&#46;L = 1))) AS T%EVAL(&amp;II+1), A%EVAL(&amp;II+1)
                                %END;
                                        WHERE ((T9&#46;L = 1) OR (T9&#46;S = A9&#46;S AND T9&#46;L = A9&#46;L-1) OR (T9&#46;S ^= A9&#46;S AND T9&#46;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]

其中的macro没有实际意义。只是书写简单一些。我的思路是1+234-56...= 1+200+30+4-50-6...然后再加几个条件而已。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 06:45 , Processed in 0.296519 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表