C语言实例:判断素数, 判断Armstrong数(阿姆斯壮数),(多种代码,详细思路)

本文将介绍 C 语言中判断素数的几种常见代码写法,并详细阐述代码思路。

方法一:暴力枚举法

暴力枚举法是最直接的判断素数的方法。对于一个数 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;
}

方法二:优化枚举法

我们发现,在暴力枚举法中,如果 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;
}

方法三:埃氏筛法

埃氏筛法是一种比较高效的筛法,可以用来求出一定范围内的所有素数。具体思路是:

  1. 先将 2 到 n 的所有整数都标记为素数;
  2. 从 2 开始,将每个素数的倍数都标记为合数;
  3. 一直重复上述步骤,直到所有的数均被标记。

以下是埃氏筛法的 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 语言实例 - 判断Armstrong数(阿姆斯壮数)

本文将介绍 C 语言中判断Armstrong数的几种常见代码写法,并详细阐述代码思路。

方法一:暴力枚举法

Armstrong数是指一个 n 位数(n≥3),它的每个位上的数字的 n 次幂之和等于它本身。例如:1^3 + 5^3 + 3^3 = 153。

暴力枚举法是最直接的判断Armstrong数的方法。对于一个数 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;
}

方法二:优化枚举法

我们发现,在暴力枚举法中,如果 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 语言中判断Armstrong数的几种常见方法和详细代码思路的介绍,希望能对大家有所帮助。

猜你喜欢

转载自blog.csdn.net/weixin_51624736/article/details/130024801
今日推荐