所以我从朋友那里得到了一个问题,他想要在向量中有效地处理两个整数,这些问题会增加到用户给定的值,我想出了这个问题:
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 /内存有效的解决方案吗?
答案 0 :(得分:0)
有许多方法可以嵌套循环。
但请记住,如果a*b==c
,则a
将c
分为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;
}