您的位置:首页 > 其它

UVa 725 Division(除法)

2017-03-19 15:19 357 查看
输入正整数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;
}


结果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: