标签:return 数论 质数 基础 素数 int 最大公约数 内容 include
1,gcd()最大公约数
2.lcm()最小公倍数
3.素数问题
1,gcd最大公约数
辗转相除法:又名欧几里得算法,,目前是求出两个正整数的最大公约数。它是最古老的算法,可以追溯到公元前300年
这条算法基于一个定理:两个正整数a和b(a大于b),他们的最大约束等于a除以b的余数c和较小数b之间的的最大公约数
2.lcm()最小公倍数
原理:最小公倍数=两整数的乘积除以最大公约数
#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
using namespace std;
int t;
//最大公约数,非递归
int gcd1(int a,int b){//要求a大于b
int r=a%b;
while(r!=0){
a=b;
b=r;
r=a%b;
}
return b;
}
//最大公约数,递归方法
int gcd2(int a,int b){
int r=a%b;
if(r==0){
return b;
}
else{
return gcd2(b,r);
}
}
/*int gcd(int a,int b)
{
if(b==0) return a;
gcd(b,a%b);
}*/
int lcm(int a,int b){
return (a*b)/gcd2(a,b);
}
int main(){
cout<<gcd1(16,4)<<endl;
cout<<gcd2(16,4)<<endl;
cout<<lcm(16,4)<<endl;
return 0;
}
3.素数问题
素数又称质数,一个大于1的自然数除了1和它自身外,不能被其他自然数整除的数叫做质数,否则叫合数。0和1既不是质数又不是合数,最小的质数是2
素数筛:大致有5种
第一种就是那种暴力循环,时间复杂度非常大,但是很好理解,基本不用
第二种加了一点技巧,因为n等于根号n乘以根号n,所以n在2到分号n种有因子,在2到n中也有因子
第三种埃氏筛:其核心思想就是打表
开始定义一个数组,全部标记为0,去遍历,每次遍历到一个标记为0的数为素数,同时,把这个数的所有背书全部标记为1,下面是埃氏筛代码
#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e8 + 10;
bool a[maxn] = { 0 };
int main() {
int n, s = 0;//s用来计算素数的个数
cin >> n;
for (int i = 2; i <= n; i++) {
if (a[i] == 0) {
for (int j = 2; j * i <= n; j++) {
a[j * i] = 1;
}
s++;
}
}
cout << s << endl;
return 0;
}
第四种线性筛又称欧拉筛:时间复杂度0(n)
标签:return,数论,质数,基础,素数,int,最大公约数,内容,include 来源: https://blog.csdn.net/lxt1101/article/details/119668926
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。