公倍数与素数筛选

这次花点时间做了一下几个简单的模板,或许以后还会有新的模板!


 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 const ll MAX = 0xffffffff;
 7 
 8 // 辗转相除法的一般写法 
 9 int gcd1(int a, int b)
10 {
11     int t = 0;
12     while(a%b != 0)
13     {
14         t = b;
15         b = a%b;
16         a = t;
17     }
18     return b;
19 }
20 
21 // 辗转相除法的递归写法 
22 int gcd(int a, int b)
23 {
24     if(a%b == 0)
25         return b;
26     else
27         return gcd(b, a%b);
28 }
29 
30 // 更相减损法
31 int gcd2(int a, int b)
32 {
33     while(a != b)
34     {
35         if(a > b)
36             a -= b;
37         else
38             b -= a;
39     }
40     return a;
41 }
42 
43 /*
44 * 素数的筛选的一般优化方法
45 * 除非出题人失了智,这种优化一般来讲可以通过了
46 * 筛选 n 内的所有素数 
47 */
48 void getPrime(int n)
49 {
50     bool p[0xfffff]; // 默认为false, 测试了一下,这个大小可以通过 
51     for(ll i=2;i<n;i++)
52         if(i%2 != 0) p[i] = true;
53     for(ll i=3;i<=sqrt(n);i+=2){
54         if(p[i]){
55             for(ll j=i+i;j<=n;j+=i)
56                 p[j] = false;
57         }        
58     }
59     for(ll i=2;i<n;i++)
60         if(p[i])
61             cout<<i<<" ";
62         cout<<endl;
63 }
64 int main()
65 {
66     int a, b;
67     cin>>a>>b;
68     
69     cout<<"最大公约数:"<<gcd2(a, b)<<endl;
70     
71     cout<<"最小公倍数:"<<(a*b)/gcd(a, b)<<endl;
72     // 100以内的所有素数 
73     getPrime(100);
74     return 0;
75  } 
View Code

2019-01-13

16:53:19

原文地址:https://www.cnblogs.com/mabeyTang/p/10263249.html