fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. // 判断是否为素数的函数
  5. int is_prime(unsigned long long n) {
  6. if (n <= 1) return 0;
  7. if (n == 2) return 1;
  8. if (n % 2 == 0) return 0;
  9.  
  10. unsigned long long limit = (unsigned long long)sqrt(n) + 1;
  11. for (unsigned long long i = 3; i <= limit; i += 2) {
  12. if (n % i == 0) {
  13. return 0;
  14. }
  15. }
  16. return 1;
  17. }
  18.  
  19. int main() {
  20. const unsigned long long limit = 100000000; // 上限1亿
  21. unsigned long long perfect_count = 0;
  22.  
  23. // 已知完美数对应的素数p列表
  24. int primes[] = {2, 3, 5, 7, 13, 17, 19, 31};
  25. int num_primes = sizeof(primes) / sizeof(primes[0]);
  26.  
  27. printf("在0~%llu范围内的完美数有:\n", limit);
  28.  
  29. for (int i = 0; i < num_primes; i++) {
  30. int p = primes[i];
  31. // 计算梅森素数:2^p - 1
  32. unsigned long long mersenne = (1ULL << p) - 1;
  33.  
  34. // 计算对应的完美数:(2^(p-1)) * (2^p - 1)
  35. unsigned long long perfect_number = (1ULL << (p - 1)) * mersenne;
  36.  
  37. // 检查完美数是否超过上限
  38. if (perfect_number > limit) {
  39. break;
  40. }
  41.  
  42. // 检查梅森数是否为素数
  43. if (is_prime(mersenne)) {
  44. printf("%llu\n", perfect_number);
  45. perfect_count++;
  46. }
  47. }
  48.  
  49. printf("共找到%llu个完美数\n", perfect_count);
  50. return 0;
  51. }
Success #stdin #stdout 0.01s 5308KB
stdin
Standard input is empty
stdout
在0~100000000范围内的完美数有:
6
28
496
8128
33550336
共找到5个完美数