一个穷举题

题目:

ab-cd=ef=g*hi,字母表示1~9的数字,不能重复。


出于效率,用C编写

 

思路如下,ab从大到小遍历,这样可以早接近答案,其余的从小到大遍历;

ab、cd确定之后,直接算出ef并且判重,在ef没有重复且大于0时,遍历g,并直接计算hi,判断是否能整除及是否重复。

为了编写方便,判重利用的是状态数组,没有采用位操作。

整体算法复杂度o(n^5),由于数据规模很小,复杂度可以接受。

 

 1#include <stdio.h>
 2#include <stdlib.h>
 3ExpandedBlockStart.gifContractedBlock.gifint main(){
 4    short a,b,c,d,e,f,g,h,i,temp,t,t0;
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    short status[10]={0,0,0,0,0,0,0,0,0};
 6ExpandedSubBlockStart.gifContractedSubBlock.gif    for (a=9;a>0;a--){
 7        if(status[a]) continue;
 8        status[a]=1;
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        for(b=9;b>0;b--){
10            if (status[b])    continue;
11            status[b]=1;
12ExpandedSubBlockStart.gifContractedSubBlock.gif            for(c=1;c<10;c++){
13                if (status[c])    continue;
14                status[c]=1;
15ExpandedSubBlockStart.gifContractedSubBlock.gif                for(d=1;d<10;d++){
16                    if (status[d])    continue;
17                    status[d]=1;
18                    temp=a*10+b-(c*10+d);
19                    e=temp-(temp/10)*10;
20                    f=temp/10;
21ExpandedSubBlockStart.gifContractedSubBlock.gif                    if (status[e]||status[f]){
22                        status[d]=0;
23                        continue;
24                    }

25                    status[e]=1;
26                    status[f]=1;
27ExpandedSubBlockStart.gifContractedSubBlock.gif                    for(g=1;g<10;g++){
28                        if (status[g])    continue;
29                        status[g]=1;
30                        t=temp%g;
31ExpandedSubBlockStart.gifContractedSubBlock.gif                        if (!t){
32                            t0=temp/g;
33                            h=t0-(t0/10)*10;
34                            i=t0/10;
35ExpandedSubBlockStart.gifContractedSubBlock.gif                            if (status[h]||status[i]){
36                                status[g]=0;
37                                continue;
38                            }

39                            printf("%d%d-%d%d=%d%d=%d*%d%d",a,b,c,d,e,f,g,h,i);
40                            exit(0);
41                        }

42                    }

43                    status[d]=0;
44                    status[e]=0;
45                    status[f]=0;
46                }

47                status[c]=0;
48            }

49            status[b]=0;
50        }

51        status[a]=0;
52    }

53    return 0;
54}

答案是93-25=68=4*1

转载于:https://www.cnblogs.com/justin-wong/archive/2009/10/26/1589672.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值