, . , , , . Brute-force- 100
#include <iostream>
bool is_ugly(unsigned n) {
while(n % 5 == 0) n /= 5;
while(n % 3 == 0) n /= 3;
while(n % 2 == 0) n /= 2;
return n == 1;
}
int main() {
unsigned counter = 0;
for(unsigned i = 1; i <= 100000000; ++i) {
if(!is_ugly(i)) {
++counter;
}
}
std::cout << counter << std::endl;
}
1 . , , 99998895 100000000, . /dev/null ( ), 6 (~ 10 , ), libstd++ gcc 4.9 -O2. , , , .
, , , ( , , ), . - , . :
#include <iostream>
#include <set> // could also use an unordered_set, except that it turns
void generate_uglies(unsigned n, std::set<unsigned> &num, unsigned threshold) {
if(n <= threshold && num.find(n) == num.end()) {
num.insert(n);
generate_uglies(n * 2, num, threshold);
generate_uglies(n * 3, num, threshold);
generate_uglies(n * 5, num, threshold);
}
}
int main() {
std::set<unsigned> num;
generate_uglies(1, num, 100000000);
std::cout << num.size() << std::endl;
}
, ...
$ time ./a.out
1105
real 0m0.001s
user 0m0.000s
sys 0m0.000s
, num.find(n) == num.end() - -, is_ugly(n) ( is_ugly ), std::unordered_set 2-3 .
. , - std::vector<bool> 100 :
void generate_uglies(unsigned n, std::vector<bool> &num) {
if(n < num.size() && !num[n]) {
num[n] = true;
generate_uglies(n * 2, num);
generate_uglies(n * 3, num);
generate_uglies(n * 5, num);
}
}
!num[i] . !num[i] , is_ugly ( 100 5 ) 1. , , , . , 12,5 .
1 , . 1,5- i7.