求最大公约数
求最大公约数最常用欧几里得算法,或称辗转相除法。
就是求a和b的最大公约数等价于求b和a mod b的最大公约数。
//求a和b的最大公约数
//函数写法
int GCD(int a, int b) {
if (b == 0) return a;
else return GCD(b, a % b);
}
//循环写法
while (1) {
if (b == 0) {
cout << "最大公约数: " << a ;
return;
}
else {
int c = b;
b = a % b;
a = c;
}
}
最小公倍数
a和b的最小公倍数是两数的乘积除以他们的最大公约数。
//求a和b的最小公倍数
cin >> a >> b;
int mul = a * b;
int c = GCD(a, b);//求最大公约数
cout << "最小公倍数: " << mul / c << endl;
判断素数
素数是只能被1和自身整除的数
//判断某个数是不是素数
bool Judge(int x) {
if (x < 2) {
return false;
}
int bound = sqrt(x);
for (int i = 2; i <= bound; ++i) {
if (x % i == 0)
return false;
}
return true;
}
//找出一定范围内所有素数 素数筛法
const int MAX_SIZE = 1001;
int isPrime[MAX_SIZE];//全局数组:素数标记数组
vector<int> primes;//保存素数,便于遍历查找
void Initial() {//初始化素数标记数组
for (int i = 0; i < 1001; ++i)//默认为素数
isPrime[i] = true;
isPrime[0] = isPrime[1] = false;
for (int i = 2; i < 1001; ++i) {
if (isPrime[i] == false) continue;
primes.push_back(i);
for (int j = i * i; j < 1001; j += i)//把素数的倍数改为false
isPrime[j] = false;
}
return;
}
int main() {//使用
Initial();
int n;
while (cin >> n) {//遍历1-n之间全部素数
for (int i = 0; i < primes.size() && primes[i] < n; ++i)
cout << primes[i] << " ";
cout << endl;
}
}
求质因数
Initial();//同上
int n;
while (cin >> n) {
int cnt = 0;
for (int i = 0; i < prime.size() && prime[i] < n; ++i) {
while (n % prime[i] == 0) {
n /= prime[i];
cnt++;
}
}
if (n > 1) cnt++;
cout << cnt << endl;
}
//另解
int n;
while (cin >> n) {
int cnt = 0;
for (int i = 2; i * i <= n; i++) {
while (n % i == 0) {
n /= i;
cnt++;
}
}
if (n != 1) cnt++;
cout << cnt << endl;
}