嘿嘿,无聊的时候写了无聊的解题程序,不过自认为思路与实现方式蛮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!=j && (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!=j && (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==g || 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;
}


执行结果:
