蓝桥C++ B 2013
古堡算法:
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
方法一
#include <iostream>
using namespace std;
int main() {
int x,y;
for(int a=1;a<=9;a++){
for(int b=0;b<=9;b++){
for(int c=0;c<=9;c++){
for(int d=0;d<=9;d++){
for(int e=1;e<=9;e++){
if(a==b||a==c||a==d||a==e||b==c||b==d||b==e||c==d||c==e||d==e)
continue;
x=a*10000+b*1000+c*100+d*10+e;
y=e*10000+d*1000+c*100+b*10+a;
if(x%y==0)
{
cout<<x<<endl;
break;
}
}
}
}
}
}
return 0;
}
方法二:
使用C++ STL中的内置全排列函数next_permutation(first,last),对数组中的顺序进行按次序从小到大排序,next_permutation()将此排列的后一个排列找出赋给当前,并返回true,如果此排序就是最后一个返回flase。包含于algorithm库中,一下举例。
此函数细节可参考:https://blog.csdn.net/c18219227162/article/details/50301513
具体实现举例:
int main() {
char chars[] = {'a', 'b', 'c','d'};
do {
cout << chars[0] << chars[1] << chars[2] << endl;
} while (next_permutation(chars, chars+3));
return 0;
}
结果
abc
acb
bac
bca
cab
cba
本题的实现:
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n[]={0,1,2,3,4,5,6,7,8,9};
do{
if(n[0]==0||n[4]==0)
continue;
int x=n[0]*10000+n[1]*1000+n[2]*100+n[3]*10+n[4];
int y=n[4]*10000+n[3]*1000+n[2]*100+n[1]*10+n[0];
if(x%y==0){
cout<<x<<endl;
break;
}
}while(next_permutation(n,n+10));
return 0;
}
结果: