【程序员面试宝典】找符合特定条件的数字

1-9的9个数字,每个数字只能出现依次,要求这样一个9位的整数:其第一位能被1整除,前两位能被2整除,...前9位能被9整除。

 

我的做法,先用vector保存数字。用全排列生成所有1-9不重复出现可能产生的9位数,然后判断是否符合要求。

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

bool isfind(vector<int> v);
void A(vector<int> &v,int s, int n, vector<vector<int>> &vv);

void find()
{
    vector<int> v;
    for(int i = 0; i < 9; i++)
        v.push_back(i + 1);

    vector<vector<int>> vv;
    A(v, 0, 9, vv);
    if(!vv.empty())
    {
        for(int i = 0; i < vv.size(); i++)
        {
            long num = 0;
            for(int j = 0; j < 9; j++)
            {
                num = num * 10 + vv[i][j];
            }
            cout<<num<<endl;
        }
    }
}


void A(vector<int> &v,int s, int n, vector<vector<int>> &vv) //s是当前交换的开始位置,n是v的大小,vv存储答案
{
    if(n == s + 1)
    {
        if(isfind(v))
            vv.push_back(v);
        return;
    }
    for(int i = s; i < n; i++)
    {
        swap(v[s], v[i]);
        A(v, s + 1, n, vv);
        swap(v[s], v[i]);
    }
}

bool isfind(vector<int> v)
{
    for(int i = 1; i <= 9; i++) //前几位
    {
        long num = 0;
        for(int j = 0; j < i; j++)
            num = num * 10 + v[j];
        if(num % i != 0)
            return false;
    }
    return true;
}

int main()
{
    find();
    return 0;
}

 

答案的方法:从最高位开始,一边构造不重复数字的9位数,一边判断当前的数字是否符合要求。直接生成了数字。更加精简快速。能够直观感受到比我的代码快很多。

#include<stdio.h>
#include<vector>
using namespace std;
bool used[10];
vector<long long>v;
void dfs(int k, long long a) //k是当前生成第几位数字 a是当前已经得到的数字
{
    if(k > 0 && a % k != 0) //不符合要求 返回
        return; 
    if(k == 9) //生成了9位数 且满足条件 压入答案
    {
        v.push_back(a);
        return;
    }

    for(int i = 1; i <= 9; i++) //遍历当前位数字所有可能的情况
    {
        if(!used[i])
        {
            used[i] = 1;
            dfs(k + 1, a * 10 + i); //继续构造下一位数字
            used[i] = 0;
        }
    }
}

int main()
{
    dfs(0, 0);
    return 0;
}

 

posted @ 2015-06-11 20:31  匡子语  阅读(323)  评论(0)    收藏  举报