C++之小学奥数(1)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 08:26   782   0

题目描述:

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++) //首位不为0
  for(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++) //列举ABCD
  for(int E=1;E<10;E++)
  {
   int A=num/1000,B=num/100%10,C=num/10%10,D=num%10; //定义A,B,C,D
   if(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、E
int 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;
}

总结:

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

触类旁通:

编程爱我

+ 我爱编程

我们爱编程

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP