1 回文数

📖 理论介绍

回文数是指正读反读都一样的数字。

例如:12321是回文数,从左向右读和从右向左读都是12321。

回文数在字符串处理和算法题中经常出现,判断一个数是否为回文数是常见的编程练习。

判断回文数的方法通常是将数字反转,然后比较反转后的数字是否与原数字相等。

💻 示例代码

#include<stdio.h>

int isPalindrome(int n) {
    int original = n;
    int reversed = 0;
    
    while(n > 0) {
        reversed = ______________;
        n /= 10;
    }
    
    return ______________;
}

int main() {
    printf("1000-2000之间的回文数有:\n");
    for(int i = 1000; i <= 2000; i++) {
        if(isPalindrome(i)) {
            printf("%d ", i);
        }
    }
    return 0;
}

2 最大公约数和最小公倍数

📖 理论介绍

最大公约数(GCD)是指两个或多个整数共有约数中最大的一个。

最小公倍数(LCM)是指两个或多个整数公有的倍数中最小的一个。

计算最大公约数的常用方法是欧几里得算法(辗转相除法)。

最大公约数和最小公倍数之间的关系是:两数的乘积等于它们的最大公约数与最小公倍数的乘积。

配套PPT[点击下载]

💻 示例代码

#include<stdio.h>

// 计算最大公约数
int gcd(int a, int b) {
    while(b != 0) {
        int temp = b;
        b = ______________;
        ______________;
    }
    return a;
}

// 计算最小公倍数
int lcm(int a, int b) {
    return ______________;
}

int main() {
    int a = 48, b = 18;
    printf("数字 %d 和 %d 的最大公约数是: %d\n", a, b, gcd(a, b));
    printf("数字 %d 和 %d 的最小公倍数是: %d\n", a, b, lcm(a, b));
    return 0;
}

3 等差数列

�哈基米 理论介绍

等差数列是指从第二项起,每一项与它的前一项的差等于同一个常数的数列。

这个常数称为公差,通常用字母d表示。

等差数列的通项公式为:aₙ = a₁ + (n-1)d

前n项和公式为:Sₙ = n/2 × [2a₁ + (n-1)d] 或 Sₙ = n/2 × (a₁ + aₙ)

💻 示例代码

#include<stdio.h>

void as(int a1, int d, int n) {
    printf("等差数列前%d项:\n", n);
    int sum = 0;
    for(int i = 0; i < n; i++) {
        int term = ______________;
        printf("%d ", term);
        sum += term;
    }
    printf("\n前%d项和: %d\n", n, ______________);
}

int main() {
    as(2, 3, 10); // 首项2,公差3,前10项
    return 0;
}

4 等比数列

📖 理论介绍

等比数列是指从第二项极速起,每一项与它的前一项的比值等于同一个常数的数列。

这个常数称为公比,通常用字母q表示。

等比数列的通项公式为:aₙ = a₁ × q⁽ⁿ⁻¹⁾

前n项和公式为:Sₙ = a₁ × (1 - qⁿ) / (1 - q) (q ≠ 1)

💻 示例代码

#include<stdio.h>
#include<math.h>

void gs(int a1, int q, int n) {
    printf("等比数列前%d项:\n", n);
    int sum = 0;
    for(int i = 0; i < n; i++) {
        int term = ______________;
        printf("%d ", term);
        sum += term;
    }
    printf("\n前%d项和: %d\n", n, sum);
}

int main() {
    ______________; // 首项2,公比3,前5项
    return 0;
}

5 特殊数列求和

📖 理论介绍

特殊数列求和是编程中常见的问题,包括计算特定模式的数列之和。

常见的特殊数列求和包括:

1. 1² + 2² + 3² + ... + n²

2. 1³ + 2³ + 3³ + ... + n³

3. 1×2 + 2×3 + 3×4 + ... + n(n+1)

4. 1/1! + 1/2! + 1/3! + ... + 1/n!

💻 示例代码

#include<stdio.h>

int main() {
    int n = 5;
    int sum1 = 0, sum2 = 0, sum3 = 0;
    float sum4 = 0;
    int factorial = 1;
    
    // 计算平方和、立方和、n(n+1)和、阶乘倒数和的
    for(int i = 1; i <= n; i++) {
        sum1+=______________;  // 平方和
        sum2 += ______________;  // 立方和
        sum3 += ______________;  // n(n+1)和
        ______________;  // 计算阶乘
        sum4 += 1.0 / factorial;  // 阶乘和
    }
    
    printf("1²+2²+...+%d² = %d\n", n, sum1);
    printf("1³+2³+...+%d³ = %d\n", n, sum2);
    printf("1×2+2×3+...+%d×%d = %d\n", n, n+1, sum3);
    printf("1/1!+1/2!+...+1/%d! = %.4f\n", n, sum4);
    
    return 0;
}

6 同构数

📖 理论介绍

同构数是指一个数的平方的末尾部分等于这个数本身。

例如:

5² = 25,末尾是5,所以5是同构数

25² = 625,末尾是25,所以25是同构数

76² = 5776,末尾是76,所以76是同构数

本程序要求找出1~1000之间的所有同构数。

💻 填空代码

#include<stdio.h>

int main() {
    int n, square;
    
    // 查找1~1000之间的所有同构数
    for(n = 1; n <= 1000; n++) {
        square = n * n;
        
        // 判断是否为同构数
        if(______1______) {  // 个位数同构数判断
            printf("%d ", n);
        } else if(______2______) {  // 两位数同构数判断
            printf("%d ", n);
        } else if(______3______) {  // 三位数同构数判断
            printf("%d ", n);
        }
    }
    
    return 0;
}

/* 拓展:判断同构数的通用函数 */
int isAutomorphic(int num) {
    int square = num * num;
    int temp = num;
    int divisor = ______4______;  // 计算除数
    
    while(temp > 0) {
        divisor *= 10;
        temp /= 10;
    }
    
    return (square ______5______ divisor) == num;  // 返回判断结果
}

7 亲和数

📖 理论介绍

亲和数是指两个数,其中每个数的真因数之和等于另一个数。

例如:220和284就是亲和数

220的真因数:1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110,和为284

284的真因数:1, 2, 4, 71, 142,和为220

本程序要求找出指定范围内的所有亲和数对。

💻 填空代码

#include<stdio.h>

// 计算一个数的真因数之和
int sumOfProperDivisors(int num) {
    int sum = ______1______;  // 初始化和
    
    for(int i = 1; i < num; i++) {
        if(num % i == 0) {
            sum ______2______ i;  // 累加真因数
        }
    }
    
    return sum;
}

int main() {
    int start, end;
    printf("请输入查找范围(起始和结束数):");
    scanf("%d %d", &start, &end);
    
    printf("亲和数对:\n");
    
    for(int num1 = start; num1 <= end; num1++) {
        int sum1 = sumOfProperDivisors(num1);
        
        // 检查是否为亲和数对
        if(sum1 > num1 && sum1 <= end) {
            int sum2 = sumOfProperDivisors(______3______);  // 计算sum1的真因数和
            
            if(______4______) {  // 判断是否为亲和数对
                printf("(%d, %d)\n", num1, sum1);
            }
        }
    }
    
    return 0;
}

/* 拓展:优化版本的亲和数查找 */
void findAmicablePairs(int start, int end) {
    int sumArray[end + 1];
    
    // 预计算每个数的真因数和
    for(int i = start; i <= end; i++) {
        sumArray[i] = sumOfProperDivisors(i);
    }
    
    // 查找亲和数对
    for(int i = start; i <= end; i++) {
        int j = sumArray[i];
        if(j > i && j <= end && sumArray[j] ______5______ i) {
            printf("(%d, %d)\n", i, j);
        }
    }
}