数学上的一些算法

来源:互联网 发布:淘宝小二旺旺标志 编辑:程序博客网 时间:2024/04/28 13:08

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 1000void 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;}


0 0
原创粉丝点击