您的位置:首页 > 职场人生

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

2015-06-11 20:31 369 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: