编程算法 - 最小能被1至n整除的数 代码(C)

最小能被1至n整除的数 代码(C)


本文地址: http://blog.csdn.net/caroline_wendy


最小能被1至n整除的数, 就是1至n所有素数的乘积.

求1至n所有素数的方法, 合数最大的质数因子, 只能在sqrt(n)以内, 可以减少遍历的范围.

时间复杂度为O(n). O(sqrt(n)*sqrt(n)).


代码:

[cpp]  view plain copy
  1. /* 
  2.  * main.cpp 
  3.  * 
  4.  *  Created on: 2014.7.20 
  5.  *      Author: Spike 
  6.  */  
  7.   
  8. /*eclipse cdt, gcc 4.8.1*/  
  9.   
  10. #include <stdio.h>  
  11. #include <memory.h>  
  12. #include <math.h>  
  13. #include <iostream>  
  14. #include <vector>  
  15.   
  16. using namespace std;  
  17.   
  18. void Primes (int n, vector<int>& vi) {  
  19.     if (n <= 2)  
  20.         return;  
  21.     bool* a = new bool[n+1];  
  22.     for (int i=1; i<=n; i++)  
  23.         a[i] = true;  
  24.     for (int i=2; i<sqrt(n); i++) {  
  25.         for (int j=2; j*i<=n; j++) {  
  26.             a[i*j] = false;  
  27.         }  
  28.     }  
  29.     for (int i=1; i<=n; ++i)  
  30.         if (a[i])  
  31.             vi.push_back(i);  
  32.     delete[] a;  
  33. }  
  34.   
  35. int Division (int n) {  
  36.     vector<int> vi;  
  37.     Primes(n, vi);  
  38.     long long min = 1;  
  39.     for (size_t i=0; i<vi.size(); ++i) {  
  40.         min *= vi[i];  
  41.     }  
  42.     return min;  
  43. }  
  44.   
  45. int main(void)  
  46. {  
  47.     int n = 13;  
  48.     int min = Division(n);  
  49.     cout << "min = " << min << endl;  
  50.     return 0;  
  51. }  


输出:

[plain]  view plain copy
  1. min = 30030  

你可能感兴趣的:(算法)