Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- long long pow(int x, int y)
- {
- if(y == 0)
- return 1;
- if(x == 0)
- return 0;
- long long ret = 1;
- for(int i = 0; i < y; i++)
- ret *= x;
- return ret;
- }
- int sqrt(int x)
- {
- int n = 0;
- if(x < 100){
- while(n * n < x)
- n++;
- return n;
- }
- while(pow(6 * pow(10, n), 2) < x)
- n++;
- double tmp = x;
- double y = 1;
- while(tmp - y > 1){
- tmp = (tmp + y) / 2;
- y = x/tmp;
- }
- int ret = tmp;
- return (ret * ret < x) ? ret + 1 : ret;
- }
- class PrimeNumbers
- {
- private:
- std::vector<int> primes;
- public:
- PrimeNumbers()
- {
- primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43};
- }
- bool isPrime(int n)
- {
- if(n < 2)
- return false;
- if(n < primes.back()){
- for(int i = 0; i < primes.size(); i++){
- if(n == primes[i])
- return true;
- }
- return false;
- }
- int max = sqrt(n);
- if(max < primes.back()){
- for(int i = 0; primes[i] < max; i++){
- if(n % primes[i] == 0)
- return false;
- }
- return true;
- }
- int i = primes.size() - 1;
- generatePrimesTo(max);
- for(i; i < primes.size(); i++){
- if(n % primes[i] == 0)
- return false;
- }
- return true;
- }
- void generatePrimesTo(int n)
- {
- if(n < primes.back())
- return;
- int i = primes.back() + 2;
- for(i; i <= n; i += 2){
- if(isPrime(i))
- primes.push_back(i);
- }
- }
- bool isSumOfPrimes(int n)
- {
- if(n < 4)
- return false;
- int max = n / 2 + 1;
- generatePrimesTo(n);
- for(int i = 0; primes[i] <= max; i++){
- if(isPrime(n - primes[i])){
- return true;
- }
- if(i == primes.size() - 1)
- max = 0;
- }
- return false;
- }
- };
- int main()
- {
- PrimeNumbers* test = new PrimeNumbers();
- int n = 0;
- while(n > -1){
- std::cin >> n;
- std::cout << test->isSumOfPrimes(n) << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement