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; }