UVa 725 Division(除法)

输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0-9的一个排列(可以有前导0),2<=n<=79
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62

分析:这里可以用暴力求解,比如a~j全部遍历一遍,但是这种做法,写起来麻烦,计算机运行起来也复杂
如下(不正确代码)

// 十个全部枚举,直接不能那个运行 
#include<iostream>
using namespace std;
bool is_true(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j){
    int array[10];
    array[0]=a;array[1]=b;array[2]=c;array[3]=d;array[4]=e;array[5]=f;array[6]=g;array[7]=h;array[8]=i;array[9]=j;
    for(int k=0;k<10;k++){
        for(int l=k+1;l<10;l++){
            if(array[k]==array[l]) return false;
        }
    }   
    return true;
}
int main()
{
    int n;
    cin>>n;
    for(int a=0;a<10;a++){
        for(int b=0;b<10;b++){
            for(int c=0;c<10;c++){
                for(int d=0;d<10;d++){
                    for(int e=0;e<10;e++){
                        int t1=a*10000+b*1000+c*100+d*10+e;//得到前五位数字 
                        for(int f=0;f<10;f++){
                            for(int g=0;g<10;g++){
                                for(int h=0;h<10;h++){
                                    for(int i=0;i<10;i++){
                                        for(int j=0;j<10;j++){
                                            int t2;
                                            t2=f*10000+g*1000+h*100+i*10+j;                                         
                                            if(t1%t2==0 && t1/t2==n && is_true(a,b,c,d,e,f,g,h,i,j)){//10个位数传入,判断每个数字是否只出现了一次 
                                                if(f==0 && a==0){//有前导0的也要注意输出 
                                                cout<<"0"<<t1<<"/0"<<t2<<"="<<n<<endl; 
                                                }else if(a==0 && f!=0){
                                                cout<<"0"<<t1<<"/"<<t2<<"="<<n<<endl; 
                                                }else if(a!=0 && f==0){
                                                cout<<t1<<"/0"<<t2<<"="<<n<<endl; 
                                                }else{
                                                cout<<t1<<"/"<<t2<<"="<<n<<endl; 
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }                        

                    }
                }
            }
        }
    }
    return 0; 
}

结果是
这里写图片描述

正确做法是即使采用暴力枚举,也是需要去认真分析问题的,这里可以直接枚举abcde就可以算出fghij,然后判断所有数字是否相同就可以了,枚举量直接从10!=3628800降低到不到10000
正确代码:

//这个枚举了前五个,大大减少了要枚举的数量,提高了效率 
//通过数组实现检出每个数是否没有重复 
#include<iostream>
using namespace std;
bool is_true(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j){
    int array[10];
    array[0]=a;array[1]=b;array[2]=c;array[3]=d;array[4]=e;array[5]=f;array[6]=g;array[7]=h;array[8]=i;array[9]=j;
    for(int k=0;k<10;k++){
        for(int l=k+1;l<10;l++){
            if(array[k]==array[l]) return false;
        }
    }   
    return true;
}
int main()
{
    int n;
    cin>>n;
    for(int a=1;a<10;a++){//被除数前导不能为零,因为n>>2 
        for(int b=0;b<10;b++){
            for(int c=0;c<10;c++){
                for(int d=0;d<10;d++){
                    for(int e=0;e<10;e++){
                        int t2;
                        int t1=a*10000+b*1000+c*100+d*10+e;//得到前五位数字 
                        if(t1%n==0){//注意这个是先行条件 
                        t2=t1/n;//得到后五位数字 
                        int j=t2%10;
                        int i=(t2/10)%10;
                        int h=(t2/100)%10;
                        int g=(t2/1000)%10;
                        int f=(t2/10000)%10;                         
                        if(is_true(a,b,c,d,e,f,g,h,i,j)){//10个位数传入,判断每个数字是否只出现了一次 
                            if(f==0 && a==0){//有前导0的也要注意输出 
                                cout<<"0"<<t1<<"/0"<<t2<<"="<<n<<endl; 
                            }else if(a==0 && f!=0){
                                cout<<"0"<<t1<<"/"<<t2<<"="<<n<<endl; 
                            }else if(a!=0 && f==0){
                                cout<<t1<<"/0"<<t2<<"="<<n<<endl; 
                            }else{
                                cout<<t1<<"/"<<t2<<"="<<n<<endl; 
                            }

                        }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

结果如图:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值