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

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;

}

 

你可能感兴趣的:(程序员)