Advertisement
Solingen

z6.2.cpp

Dec 21st, 2024
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. bool isPrime(unsigned long long x)
  5. {
  6.     if (x < 2) return false;
  7.     for (unsigned long long i = 2; i*i <= x; i++)
  8.         if (x % i == 0) return false;
  9.     return true;
  10. }
  11.  
  12. // Вычисляет 2^(2^n) + 1 в 64-битном диапазоне
  13. // Вернёт 0, если результат выходит за пределы unsigned long long
  14. unsigned long long fermatNumber(int n)
  15. {
  16.     // 2^n
  17.     if (n >= 64)
  18.     {
  19.         // 2^n уже не влезет в 64 бита, значит точно overflow
  20.         return 0;
  21.     }
  22.     unsigned long long exponent = 1ULL << n; // это 2^n
  23.    
  24.     // Если exponent >= 64, тогда 2^(2^n) точно не влезет
  25.     if (exponent >= 64)
  26.     {
  27.         return 0;
  28.     }
  29.     unsigned long long val = 1ULL << exponent; // 2^(2^n)
  30.     // Проверим, что не было переполнения
  31.     if (val == 0) return 0; // переполнение
  32.     return val + 1ULL;      // F_n
  33. }
  34.  
  35. int main()
  36. {
  37.     int N;
  38.     cout << "Сколько чисел Ферма вывести (n=0..N-1)? ";
  39.     cin >> N;
  40.  
  41.     for (int i = 0; i < N; i++)
  42.     {
  43.         unsigned long long f = fermatNumber(i);
  44.         if (f == 0)
  45.         {
  46.             cout << "F(" << i << ") слишком велико для 64-бит.\n";
  47.             continue;
  48.         }
  49.         cout << "F(" << i << ")=" << f;
  50.         if (isPrime(f)) cout << " (простое)\n";
  51.         else            cout << " (непростое)\n";
  52.     }
  53.     return 0;
  54. }
  55.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement