一道微软面试题(写了个无聊解题程序)

本文通过编程手段解决一道源自微软的面试题目,寻找使等式成立的七个互不相同的阿拉伯数字。采用递归和列表辅助的方法,避免了穷举搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嘿嘿,无聊的时候写了无聊的解题程序,不过自认为思路与实现方式蛮cool的~~

 

/* ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^
 *
 * 最近师兄师姐都在忙着找工作,小弟对面试题常有所闻 
 * (下面这道题据说来自microsoft):
 *   有算式:  
 *          a b c d e 
 *      *              f
 *      ---------------
 *      g g g g g g
 *    其中abcdefg代表七个互不相同的阿拉伯数字,试求出它们
 *  
 * 这道题当时我看了,觉得是一道耐心题,基本的解题思路比较容易获得。
 * 第一直觉是列张表,进行一下if or case的判断,入口点自然非g莫属。
 * 午饭后,不困(因为项目有突破,大家伙一起去撮了一顿),欣欣然想敲几行代码来实现,如是有此程序!
 * 嘿嘿,巧办法当然有,不过不适合电脑(用程序解决俺也坚决反对穷举,呵呵,我喜欢拟人化的程序)
 *
 * ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^
*/


#include 
<iostream>
#include 
<list>
using namespace std;


typedef 
struct _PAIR{
public:
 _PAIR(
int i,int j):n1(i),n2(j){}
 
int n1;
 
int n2;
}
PAIR;

/*返回乘积个位为cs的0~9因子对,比如乘积个位为1,则返回3,7和7,3两对因子*/
void getfactor(int cs,list<PAIR> &lst){
 
int i,j;
 
//这个地方如果完全模拟人的思维应该使用switch语句,但谁叫它是电脑呢:)
 lst.clear();
 
for(i=0;i<10;i++)
 
{
  
for(j=0;j<10;j++){
   
if(i!=&& (i*j)%10==cs%10){//已经排除了i=j的情况
    lst.push_back(PAIR(i,j));
   }

  }

 }

}

void getfactor(int cs,list<PAIR> &lst,int n1){//指定一个因子n1
 int j;
 lst.clear();
 
for(j=0;j<10;j++){
  
if(n1!=&& (n1*j)%10==cs%10){
   lst.push_back(PAIR(n1,j));
  }

 }

}

/*辅助类*/
class Assist{
public:
 
void init(){
  count
=-1;
 }

 
void use(int i){
  num[
++count]=i;
 }

 
void unuse(){
  count
--;
 }

 
bool isused(int i){
  
for(int k=0;k<=count;k++){
   
if(i==num[k]) return true;
  }

  
return false;
 }

private:
 
int num[10];
 
int count;
}
;
/*检查是否符合算式,该函数为第归*/
bool Check(int level/*第level位检查*/,int c/*低位的进位*/);

int a,b,c,d,e,f,g;
Assist assist;
int main(int argc, char* argv[])
{
 
int i;
 list
<PAIR> lst;
 list
<PAIR>::iterator it;
 
//测试getfactor函数
 for(i=0;i<10;i++){
  getfactor(i,lst);
  cout
<<"---"<<i<<"---"<<endl;
  
for(it=lst.begin();it!=lst.end();it++){
   cout
<<it->n1<<","<<it->n2<<"  |  ";
  }

  cout
<<endl;
 }

 cout
<<endl<<"======================="<<endl<<"the reuslt is:"<<endl;
 
//求解
 for(i=0;i<10;i++){
  g
=i;
  assist.init();
  assist.use(g);
  
//0位
  getfactor(g,lst);
  
for(it=lst.begin();it!=lst.end();it++){
   
if(it->n1==|| it->n2==g) continue;
   f
=it->n1;
   assist.use(f);
   
//Check(0,0);
   if(!Check(0,0)){
    assist.unuse();
    
continue;
   }

   
//输出可行组合
   cout<<endl<<"  "<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<endl;
   cout
<<"*"<<"         "<<f<<endl<<"-------------"<<endl;
   cout
<<g<<" "<<g<<" "<<g<<" "<<g<<" "<<g<<" "<<g<<endl;
  }

 }

 cout
<<" ======================= ";
 
return 0;
}

/*检查是否符合算式,该函数为第归*/
bool Check(int level/*第level位检查*/,int c/*低位的进位*/){
 
if(level==5){
  
if(c==g) return true;
  
else return false;
 }

 
/*已知因子f和乘积gggggg*/
 list
<PAIR> lst;
 list
<PAIR>::iterator it;
 getfactor((g
-c+10)%10,lst,f);
 
for(it=lst.begin();it!=lst.end();it++){
  
if(assist.isused(it->n2)) 
   
continue;
  assist.use(it
->n2);
  
switch(level) {
  
case 0:
   e
=it->n2;break;
  
case 1:
   d
=it->n2;break;
  
case 2:
   c
=it->n2;break;
  
case 3:
   b
=it->n2;break;
  
case 4:
   a
=it->n2;break;
  
default:
   
break;
  }

  
if(Check(level+1,(f*it->n2+c)/10)) return true;
  assist.unuse();
//回退
 }

 
return false;
}
 

 

执行结果:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值