zoukankan      html  css  js  c++  java
  • 【程序员面试宝典】找符合特定条件的数字

    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;
    }
  • 相关阅读:
    [HNOI2006]超级英雄
    [CTSC1999]家园
    火星探险问题
    [HNOI2008]GT考试
    [USACO14DEC]后卫马克Guard Mark
    [NOI2018]归程
    [USACO15DEC]最大流Max Flow
    [NOIPlus]斗地主
    [LUOGU] P3128 [USACO15DEC]最大流Max Flow
    [BZOJ] 1878: [SDOI2009]HH的项链
  • 原文地址:https://www.cnblogs.com/dplearning/p/4570071.html
Copyright © 2011-2022 走看看