在向量中找到两个整数,乘以给定值

时间:2018-05-21 17:05:44

标签: c++

所以我从朋友那里得到了一个问题,他想要在向量中有效地处理两个整数,这些问题会增加到用户给定的值,我想出了这个问题:

void searchForValue(std::vector<int> &vectNums)
{
    std::vector<int>::iterator numIter;
    std::set<int> pastNums;

    pastNums.insert(vectNums[0]);
    for (numIter = vectNums.begin() + 1; numIter != vectNums.end(); numIter++)
    {
        if ((VALUE_TO_FOUND % *numIter == 0) && (pastNums.count(VALUE_TO_FOUND / *numIter) > 0))
        {
            std::cout << "There is two integers, that are multiply to " << VALUE_TO_FOUND << std::endl;
            break;
        }
        else
            pastNums.insert(*numIter);
    }
}

对此有更多cpu /内存有效的解决方案吗?

1 个答案:

答案 0 :(得分:0)

有许多方法可以嵌套循环。

但请记住,如果a*b==c,则ac分为c%a==0

因此,您可以使用该事实跳过内部循环中无法回答的元素:

#include <iostream>
#include <tuple>
#include <vector>

typedef std::tuple<bool,std::size_t,std::size_t> find_result;


find_result find(int target, const std::vector<int>& vec){
    const auto bvec{vec.begin()};
    const auto evec{vec.end()};
    for(auto i{bvec};i!=evec;++i){
        if(target%(*i)==0){   //Here's the modulo check.
            for(auto j{i+1};j!=evec;++j){
                if((*i)*(*j)==target){
                    return {true,i-bvec,j-bvec};
                }
            }
        }
    }
    return {false,0,0};
}

bool check(int target,const std::vector<int>& vec,const find_result& expected){
    auto result{find(target,vec)};
    if(result!=expected){
        std::cout<<std::get<0>(result)<<' '<<std::get<1>(result)<<' '<<std::get<2>(result);
        return false;
    }
    if(std::get<0>(result)==false){
        return true;
    }
    const auto i{std::get<1>(result)};
    const auto j{std::get<2>(result)};
    if(i<0||i>=vec.size()){
        return false;
    }
    if(j<0||j>=vec.size()){
        return false;
    }
    if(target!=vec[i]*vec[j]){
        return false;
    }
    return true;
}

int main() {
    int errors{0};
    if(!check(15,{2,3,6,15,5},{true,1,4})){
        ++errors;
    }
    if(!check(15,{2,3,6},{false,0,0})){
        ++errors;
    }
    if(!check(16,{4,7,4,8},{true,0,2})){
        ++errors;
    }
    if(!check(0,{1,2,3,8},{false,0,0})){
        ++errors;
    }
    if(!check(0,{1,2,3,8,0},{true,0,4})){
        ++errors;
    }
    if(!check(210,{6,6,2,3,7,5,10,210,35,70,89},{true,0,8})){
        ++errors;
    }
    if(errors>0){
        std::cout<<"Errors\n";
    }else{
        std::cout<<"Success\n";
    }
    return 0;
}