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全部遍历一遍,但是这种做法,写起来麻烦,计算机运行起来也复杂
如下(不正确代码)
结果是
正确做法是即使采用暴力枚举,也是需要去认真分析问题的,这里可以直接枚举abcde就可以算出fghij,然后判断所有数字是否相同就可以了,枚举量直接从10!=3628800降低到不到10000
正确代码:
结果如图:
样例输入:
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; }
结果如图:
相关文章推荐
- 除法(Division UVa 725)
- (除法)Division UVA - 725
- 除法(division,UVa 725)
- 除法(Division,UVa 725)
- 例题7-1 除法(Division, UVa 725)
- uva 725 Division(除法)暴力法!
- 除法(Division,UVa 725)
- 除法(Division, UVa 725)
- UVA 725 Division 除法
- 除法(Division, UVa 725)
- 除法(Division,UVa 725)
- 7-1 除法(Division,UVa 725)
- 除法(Division ,UVA 725)-ACM集训
- 除法(Division, UVa 725)
- 除法(Division ,UVA 725)-ACM集训
- UVA-725除法-Division
- UVa 725 Division(除法)
- UVA 725 - Division
- uva 725 Division
- UVA 725 Division(暴力枚举 简单)