Пример языка C: оценка простых чисел, оценка чисел Армстронга (числа Армстронга), (несколько кодов, подробные идеи)

В этой статье будут представлены несколько распространенных методов написания кода для оценки простых чисел на языке C, а также подробно рассмотрены идеи кода.

Метод 1: метод насильственного перебора

Насильственное перечисление — самый прямой метод оценки простых чисел. Для числа n мы перечисляем от 2 до n-1, если есть число, которое может делить n, то n не является простым числом. В противном случае n простое число.

Ниже приведена реализация метода на языке C:

#include <stdio.h>

int isPrime(int n) {
    if (n <= 1) { // 边界条件
        return 0;
    }
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    if (isPrime(n)) {
        printf("%d 是素数\\n", n);
    } else {
        printf("%d 不是素数\\n", n);
    }
    return 0;
}

Метод 2: оптимизация метода перечисления

Мы обнаружили, что в методе перебора грубой силы, если n делится на любое число от 2 до n-1, то n не должно быть простым числом. Но если n делится на любое число от 2 до sqrt(n), то n не должно быть простым числом. Потому что если n не является простым числом, то его нужно разложить на произведение двух чисел, одно из которых меньше или равно sqrt(n), а другое больше или равно sqrt(n). И если n может делиться на любое число от 2 до sqrt(n), то эти два числа должны быть в диапазоне от 2 до sqrt(n), что противоречит предыдущему предположению.

Ниже приведена реализация оптимизированного метода перечисления на языке C:

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

int isPrime(int n) {
    if (n <= 1) { // 边界条件
        return 0;
    }
    int m = sqrt(n);
    for (int i = 2; i <= m; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    if (isPrime(n)) {
        printf("%d 是素数\\n", n);
    } else {
        printf("%d 不是素数\\n", n);
    }
    return 0;
}

Метод 3: Метод сита Elsieve

Метод решета Эсперского — относительно эффективный метод решета, который можно использовать для нахождения всех простых чисел в определенном диапазоне. Конкретная идея такова:

  1. Сначала пометьте все целые числа от 2 до n как простые числа;
  2. Начиная с 2, пометить каждое кратное простому числу как составное число;
  3. Повторяйте вышеуказанные шаги, пока не будут отмечены все числа.

Ниже приведена реализация метода Essie на языке C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int* sieve(int n) {
    int* primes = (int*) malloc(sizeof(int) * (n + 1));
    memset(primes, 1, sizeof(int) * (n + 1)); // 先将所有数标记为素数
    primes[0] = primes[1] = 0; // 0 和 1 不是素数
    int m = sqrt(n);
    for (int i = 2; i <= m; i++) {
        if (primes[i]) { // i 是素数
            for (int j = i * i; j <= n; j += i) {
                primes[j] = 0; // i 的倍数都不是素数
            }
        }
    }
    return primes;
}

int isPrime(int n) {
    if (n <= 1) { // 边界条件
        return 0;
    }
    int m = sqrt(n);
    for (int i = 2; i <= m; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    if (isPrime(n)) {
        printf("%d 是素数\\n", n);
    } else {
        printf("%d 不是素数\\n", n);
    }
    int* primes = sieve(n);
    printf("%d 以内的素数有:", n);
    for (int i = 2; i <= n; i++) {
        if (primes[i]) {
            printf("%d ", i);
        }
    }
    printf("\\n");
    free(primes);
    return 0;
}

Выше представлено несколько общих методов и подробные идеи кода для оценки простых чисел в языке C. Я надеюсь, что это может быть полезно для всех.

Пример языка C - оценка числа Армстронга (число Армстронга)

В этой статье будут представлены несколько распространенных методов написания кода для оценки чисел Армстронга на языке C, а также подробно рассмотрены идеи кода.

Метод 1: метод насильственного перебора

Число Армстронга относится к n-значному числу (n≥3), и сумма n-й степени чисел каждой из его цифр равна самой себе. Например: 1^3 + 5^3 + 3^3 = 153.

Насильственный подсчет — самый прямой метод оценки чисел Армстронга. Для числа n мы сначала вычисляем количество его цифр, затем по очереди вычисляем n-ю степень каждой цифры и, наконец, сравниваем их сумму с n.

Ниже приведена реализация метода на языке C:

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

int isArmstrong(int n) {
    int m = n;
    int sum = 0;
    int k = 0;
    while (m > 0) {
        k++;
        m /= 10;
    }
    m = n;
    while (m > 0) {
        sum += pow(m % 10, k);
        m /= 10;
    }
    return sum == n;
}

int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    if (isArmstrong(n)) {
        printf("%d 是Armstrong数\\\\n", n);
    } else {
        printf("%d 不是Armstrong数\\\\n", n);
    }
    return 0;
}

Метод 2: оптимизация метода перечисления

Мы обнаружили, что в методе перебора грубой силы, если n делится на любое число от 2 до n-1, то n не должно быть простым числом. Но если n делится на любое число от 2 до sqrt(n), то n не должно быть простым числом. Потому что если n не является простым числом, то его нужно разложить на произведение двух чисел, одно из которых меньше или равно sqrt(n), а другое больше или равно sqrt(n). И если n может делиться на любое число от 2 до sqrt(n), то эти два числа должны быть в диапазоне от 2 до sqrt(n), что противоречит предыдущему предположению.

Ниже приведена реализация оптимизированного метода перечисления на языке C:

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

int isArmstrong(int n) {
    int m = n;
    int sum = 0;
    int k = 0;
    while (m > 0) {
        k++;
        m /= 10;
    }
    m = n;
    while (m > 0) {
        sum += pow(m % 10, k);
        m /= 10;
    }
    return sum == n;
}

int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    if (isArmstrong(n)) {
        printf("%d 是Armstrong数\\\\n", n);
    } else {
        printf("%d 不是Armstrong数\\\\n", n);
    }
    return 0;
}

Выше представлено несколько общих методов и подробные идеи кода для оценки чисел Армстронга на языке C. Я надеюсь, что это может быть полезно для всех.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51624736/article/details/130024801
conseillé
Classement