数字江湖十二式:从模运算到素数筛的神秘法则

在数字的江湖里,每一个算法都是一门独特的武林绝学。今天,作为 C++ 小白闯荡 CSDN 算法江湖的第十二天,我要为大家揭秘模运算、素数筛、最小公倍数和最大公约数这些神奇的数字秘术,它们不仅能让代码更高效,还暗藏着令人拍案叫绝的智慧!

一、模运算:数字世界的 “余数判官”

想象一下,你在参加一场循环赛,每 3 场比赛为一轮。当你打完第 7 场比赛时,其实已经完成了两轮,还多打了 1 场。这 “多出来的 1 场”,就是模运算的结果。在 C++ 中,模运算使用%符号,它能快速算出两个数相除后的余数,就像数字世界里公正的 “余数判官”。

#include 
int main() {
    int dividend = 7;
    int divisor = 3;
    int remainder = dividend % divisor;
    std::cout << dividend << " 除以 " << divisor << " 的余数是: " << remainder << std::endl;
    return 0;
}

模运算的神奇之处远不止于此。它可以用于判断奇偶性(num % 2 == 0表示偶数),还能在密码学中实现循环移位加密,让数字在既定的轨道上 “跳舞”。

二、素数筛:捕捉质数的 “超级渔网”

质数,是那些只能被 1 和自身整除的数字勇士,比如 2、3、5、7。但在茫茫数海中,如何快速找到它们呢?这就需要素数筛这张 “超级渔网” 了。

最基础的埃拉托色尼筛法(Sieve of Eratosthenes),就像一场数字大扫除。先把所有数字列出来,从 2 开始,把 2 的倍数都标记为非质数;接着到 3,把 3 的倍数标记;以此类推,最后剩下没被标记的就是质数。

#include 
#include 
std::vector sieveOfEratosthenes(int n) {
    std::vector isPrime(n + 1, true);
    isPrime[0] = isPrime[1] = false;
    for (int i = 2; i * i <= n; ++i) {
        if (isPrime[i]) {
            for (int j = i * i; j <= n; j += i) {
                isPrime[j] = false;
            }
        }
    }
    std::vector primes;
    for (int i = 2; i <= n; ++i) {
        if (isPrime[i]) {
            primes.push_back(i);
        }
    }
    return primes;
}
int main() {
    int limit = 50;
    std::vector primes = sieveOfEratosthenes(limit);
    std::cout << "小于等于 " << limit << " 的质数有: ";
    for (int prime : primes) {
        std::cout << prime << " ";
    }
    return 0;
}

还有更高级的线性筛法(欧拉筛),它能以更优的时间复杂度捕捉质数,在处理大规模数据时效率惊人,堪称数字江湖中的 “绝世神兵”。

三、最大公约数与最小公倍数:数字的 “和谐密码”

最大公约数(GCD),就像两个数字之间最紧密的 “纽带”,是能同时整除它们的最大数字。而最小公倍数(LCM),则是它们共同 “孕育” 出的最小倍数,二者关系紧密,暗藏着数字间的和谐密码。

求最大公约数最经典的方法是欧几里得算法(辗转相除法),它利用 “两数相除的余数和较小数的最大公约数,等于原来两数的最大公约数” 这一原理,不断迭代,直至余数为 0。

int gcd(int a, int b) {
    return b == 0? a : gcd(b, a % b);
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

有了这两个函数,我们就能轻松解决很多实际问题,比如计算两个齿轮转动多少次后回到初始位置,或是分配资源时如何做到最合理。

在数字江湖的探险中,模运算、素数筛、最大公约数和最小公倍数只是众多绝学中的冰山一角。它们看似简单,却蕴含着无穷的力量。作为 C++ 小白,我将继续在这片江湖中探索,期待与大家分享更多有趣又实用的算法奥秘!

你可能感兴趣的:(算法)