C++之小学奥数(1)

来源:互联网 发布:js私有属性 编辑:程序博客网 时间:2024/04/28 06:19

题目描述:

ABCD

*     E

         

DCBA

 

按以上格式输出ABCDE的值(A!=B&&A!=C&&A!=D&&A!=E&&B!=C&&B!=D&&B!=E&&C!=D&&C!=E&&D!=E)。

 

解题思路:

看到这道题之后,许多人想到的是枚举,就像这样

#include<iostream>using namespace std;int main()  {  for(int A=1;A<10;A++) //首位不为0for(int B=0;B<10;B++)for(int C=0;C<10;C++)for(int D=1;D<10;D++) //首位不为零for(int E=1;E<10;E++) //首位不为零if((A*1000+B*100+C*10+D)*E==D*1000+C*100+B*10+A&&A!=B&&A!=C&&A!=D&&A!=E&&B!=C&&B!=D&&B!=E&&C!=D&&C!=E&&D!=E)cout<<A<<B<<C<<D<<endl<<"*  "<<E<<endl<<"----"<<endl<<D<<C<<B<<A<<endl;}  


或者这样:

#include<iostream>using namespace std;int main()  {  for(int num=1000;num<10000;num++) //列举ABCDfor(int E=1;E<10;E++){int A=num/1000,B=num/100%10,C=num/10%10,D=num%10; //定义A,B,C,Dif(num*E==D*1000+C*100+B*10+A&&A!=B&&A!=C&&A!=D&&A!=E&&B!=C&&B!=D&&B!=E&&C!=D&&C!=E&&D!=E&&A&&D)cout<<A<<B<<C<<D<<endl<<"*  "<<E<<endl<<"----"<<endl<<D<<C<<B<<A<<endl;}}  


也可以 首先运用全排列的思想编写dfs函数,接着编写check函数来判断是否满足条件和最高位不为0,最后定义output函数输出。

实现代码:

#include<iostream>using namespace std;void dfs(int ); //全排列函数void check(void); //判断函数void output(void); //输出函数int num[6]; //存储A、B、C、D、Eint number1,number2; //存储前后两个四位数的值bool flag[10]; //标记数字main(){dfs(1);}void dfs(int x){for(int i=0;i<10;i++)if(!flag[i]){num[x]=i; //赋值flag[i]=1; //标记该数字if(x==5) check(); //若已给A、B、C、D、E赋值,则判断else dfs(x+1); //下一轮搜索flag[i]=0; //回溯/*num[x]=0;*/ //可省略不写}}void check(){if(!num[1]||!num[4]||!num[5]) return ; //若最高位为0,不执行output()number1=num[1]*1000+num[2]*100+num[3]*10+num[4]; //赋值number2=num[4]*1000+num[3]*100+num[2]*10+num[1]; //赋值if(number1*num[5]==number2) output(); //判断}void output(){cout<<number1<<endl<<"*  "<<num[5]<<endl<<"----"<<endl<<number2<<endl;}

总结:

像这样的题,我们可以利用全排列的思想来解决,这种思想可以解决许多题。

触类旁通:

    编程爱我

+  我爱编程

                  

我们爱编程