数学相关
最大公约数
- 模板
int gcd(int a, int b)
{
int x = a % b;
while(x)
{
a = x;
a ^= b ^= a ^= b;
x = a % b;
}
return b;
}
最大公倍数
- 模板
int lcm(int a, int b){
return a*b / gcd(a, b);
}
质数相关
确定是不是质数/素数
- 模板
bool is_prime(int n)
{
if(i < 2) return false;
for(int i = 2; i <= n / i; i ++ )
{
if(n % i == 0) reutrn false; // 判断是不是素数
}
return ture;
}
分解质因数
- 分析
这里有个性质:n中最多只含有一个大于sqrt(n)的因子。证明通过反证法:如果有两个大于sqrt(n)的因子,那么相乘会大于n,矛盾。证毕
于是我们发现最多只有一个大于sqrt(n)的因子,对其进行优化。先考虑比sqrt(n)小的,代码和质数的判定类似
最后如果n还是>1,说明这就是大于sqrt(n)的唯一质因子,输出即可。
- 模板
#include <bits/stdc++.h>
using namespace std;
int n, x;
int main()
{
cin >> n;
while(n -- )
{
cin >> x;
for(int i = 2; i <= x / i; i ++ ) // 从2开始递增遍历判断
{
if(x % i == 0) // 若是因子
{
int s = 0;
while(x % i == 0) // 循环判断,将如 8 = 2^3 这种情况搞出来
{
s ++;
x /= i;
}
cout << i << ' ' << s << endl;
}
}
if(x != 1) cout << x << ' ' << '1' << endl; // 这是一个性质,若最后x不为1,则x一定是一个质因子
cout << endl;
}
return 0;
}
质数筛
- 线性筛法(欧拉筛)O(n)
- 诶氏筛法 O(nloglogn)
标签:return,int,质数,sqrt,数学,大于,相关,模板
From: https://www.cnblogs.com/hnu-hua/p/18179470