[C/C++ 演算法]- 完美數
剛才找資料時發現一個C/C++的教學網站,趕快發揮(C/P)的長才將它備份來,有需要的同好,歡迎來(C/P)一下^^。
拷貝來源:
http://openhome.cc/Gossip/AlgorithmGossip/
http://openhome.cc/Gossip/AlgorithmGossip/PerfectNumber.htm
 #include <stdio.h>  #include <stdlib.h> 
  #define P 10000 #define N 5000
  void create(int*);             // 建立質數表 void filter(int*, int); void factor(int, int*, int*);  // 因數分解 int isPerfect(int, int*);      // 判斷完美數
  int main(void) {      int primes[N + 1] = {0};     create(primes);          int i;     for(i = 2; i <= P; i++) if(isPerfect(i, primes)) {         printf("Perfect Number%5d\n", i);              }
      return 0;  } 
  void create(int* primes) {     primes[2] = primes[3] = primes[5] = 1;          int i;     for(i = 1;6 * i + 5 <= N; i++) {         primes[6 * i + 1] = primes[6 * i + 5] = 1;      }     if(6 * i + 1 <= N) { primes[6 * i + 1] = 1; }          int n;     for(n = 0;(6 * n + 5) * (6 * n + 5) <= N; n++) {         filter(primes, 6 * n + 1);         filter(primes, 6 * n + 5);     }          if((6 * n + 1) * (6 * n + 1) <= N) { filter(primes, 6 * n + 1); }   }
  void filter(int* primes, int i) {     if(primes[i]) {          int j;         for(j = 2; j * i <= N; j++) {             primes[j * i] = 0;          }     } }
  void factor(int num, int* factors, int* primes) {      int i, j;     for(i = 2, j = 0; i * i <= num;) if(primes[i] && num % i == 0) {         factors[j++] = i;         num /= i;     } else { i++; }     factors[j] = num; }
  int isPerfect(int num, int* primes) {       int factors[N / 2 + 1] = {0};     factor(num, factors, primes); 
      int s = 1;      int i = 0;     while(factors[i] != 0) {          int r = 1;          int q = 1;         do {              r *= factors[i];              q += r;              i++;          } while(factors[i - 1] == factors[i]);          s *= q;     }           return s / 2 == num;  }   
  | 
 
 
 
沒有留言:
張貼留言