1.求两个数的最大公约数
可以使用辗转相除法,实现简单,效率高。
int gcd(int a, int b)
{
while (b != 0)
{
int t = a%b;
a = b;
b = t;
}
return a;
}
假设r是a,b的最大公约数,则有(a,b)=(b,r),这就是原理。
2.求素数(质数)的算法
第一种暴力解法,时间复杂度:O(n^2)
#include<iostream>
using namespace std;
#define MAX 1000
void main()
{
int i, j;
cout << "输出 "<<MAX<<" 以内的素数" << endl;
cout <<MAX<<" 内的素数为" << endl;
for (i = 1; i <= MAX; i++)
{
for (j = 2; j<i; j++)
{
if (i%j == 0)
break;
}
if (i == j)
cout << " " << i;
}
}
第二种筛法求素数,时间复杂度O(nlg(lgn)),接近线性
void FilterPrime(int n)
{
bool* isPrimes = new bool[n + 1];
for (int i = 2; i <= n; ++i)
{
isPrimes[i] = true;
}//创建一个与传入N 相同 大小的bool型数组
isPrimes[2] = true;
for (int j = 2; j <= n; ++j)
{
if (isPrimes[j] == true)
{
for (int m = 2; j*m <= n; ++m)
{
isPrimes[j*m] = false;
}//这里 j会从2~n j*m 的数就不是素数 把对应的数组的数组 去掉
}
}
for (int k = 2; k <= n; ++k)
{
if (isPrimes[k] == true)
{
cout << k << " ";
}
}
delete[] isPrimes;
}