博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

软件工厂的考试题目程序

Posted on 2006-12-17 22:59  空气  阅读(244)  评论(0)    收藏  举报
#include <iostream>
using namespace std;

int mul1[5];       // 第一个乘数
int mul2;          // 第二个乘数
int result[5];     // 结果
bool used[10];     // 记录每个数字是否用过

/** 对乘数的每一位进行列举 **/
// digit 是位数: 个十百千分别是1234
// carry 是上一位的进位
void fun(int digit, int carry)
{
    
if (digit > 4)
    
{
        
if (carry > 0)
            
return;

        
/* 找到,输出结果 */
        
int i;
        
for (i = 4; i >= 1; i--)
            cout 
<< mul1[i];
        cout 
<< endl;
        cout 
<< "*  " << mul2 << endl;
        cout 
<< "----" << endl;
        
for (i = 4; i >= 1; i--)
            cout 
<< result[i];
        cout 
<< endl << endl;        
    }


    
int num;
    
int temp;
    
/* 枚举这一位所有的数字 */
    
for (int i = 1; i <= 9; i++)
    
{
        
/* 若数字用过则继续寻找 */
        
// 这里可以剪掉很多枝
        if (used[i])
            
continue;
        temp 
= i * mul2 + carry;
        num 
= temp % 10;
        
if (used[num] || num == 0 || i == num)
            
continue;

        
/* 记录 */
        mul1[digit] 
= i;
        result[digit] 
= num;

        
/* 继续 DFS 遍历 */
        used[i] 
= true;
        used[num] 
= true;
        fun(digit
+1, temp/10);
        used[i] 
= false;
        used[num] 
= false;
    }

}


int main()
{
    
for (mul2 = 2; mul2 <= 9; mul2++)
    
{
        used[mul2] 
= true;
        fun(
10);
        used[mul2] 
= false;
    }


    
return 0;
}




http://blog.sina.com.cn/u/4b09e6080100071n