一个枚举问题的多种解法

abc*da=bcde每个字母代表一个0~9的数字,求所有答案,可以用暴力枚举

第一个,自己曾经的思路,暴力枚举,条件复杂,用宏定义代替了

http://blog.csdn.net/a158337/article/details/40591517

#include<stdiohttp://blog.csdn.net/a158337/article/details/40591517.h>
#define CONDITION_1 !((a==b)||(a==c)||(a==d)||(b==c)||(b==d)||(c==d))
#define CONDITION_2 ((a*100+b*10+c)*(d*10+a)/10==(b*100+c*10+d))
#define GET_E_VALUE (a*100+b*10+c)*(d*10+a)%10
#define CONDITION_3 ((e!=a)&&(e!=b)&&(e!=c)&&(e!=d))
int main()
{
    int a,b,c,d,e;
    for(a=0;a<=9;a++)
    {
        for(b=0;b<=9;b++)
        {
            for(c=0;c<=9;c++)
            {
                for(d=0;d<=9;d++)
                {
                    if(CONDITION_1)
                    {
                        e=GET_E_VALUE;
                        if(CONDITION_2&& CONDITION_3)
                        {
                            printf("%d*%d=%d",(a*100+b*10+c),(d*10+a),(a*100+b*10+c)*(d*10+a));
                        }
                    }
                }
            }
        }
    }


}
第二种:改进了点,代码写起来简单了

#include<stdio.h>
int a[5];
int book[10];
int main()
{
    int sum=0;
    int i;
        for(a[0]=0;a[0]<=9;a[0]++)
         for(a[1]=0;a[1]<=9;a[1]++)
          for(a[2]=0;a[2]<=9;a[2]++)
           for(a[3]=0;a[3]<=9;a[3]++)
            for(a[4]=0;a[4]<=9;a[4]++)
            {
                sum=0;
                 for(i=0;i<10;i++)
                    book[i]=0;
                for(i=0;i<5;i++)
                {
                    book[a[i]]=1;
                }
                for(i=0;i<10;i++)
                {
                    if(book[i]==1)
                    sum++;
                }
                if(sum==5)
                {
                     if((a[0]*100+a[1]*10+a[2])*(a[3]*10+a[0])==(a[1]*1000+a[2]*100+a[3]*10+a[4]))
                    {
                        if(a[3]!=0)
                        printf("%d%d%d*%d%d=%d%d%d%d\n",a[0],a[1],a[2],a[3],a[0],a[1],a[2],a[3],a[4]);

                    }
                }
            }
        return 0;

}

第三种:DFS 深度优先搜索算法


#include<stdio.h>
int a[5];
int book[10];
void dfs(int cur,int n)
{
    int i=0;
    if(cur==n)
    {
        if((a[0]*100+a[1]*10+a[2])*(a[3]*10+a[0])==(a[1]*1000+a[2]*100+a[3]*10+a[4]))
        {
            if(a[3]!=0)
            printf("%d%d%d*%d%d=%d%d%d%d\n",a[0],a[1],a[2],a[3],a[0],a[1],a[2],a[3],a[4]);

        }
    }
    else
    {
        for(i=0;i<=9;i++)
        {
            if(book[i]==0)
            {
                a[cur]=i;
                book[i]=1;
            }
            dfs(cur+1,n);
            book[i]=0;
        }
    }
}
int main()
{
    dfs(0,5);
    
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值