素数

素数的定义
只能被1和它本身整除的数叫素数。如2、3、5、7.
合数的定义
除了“1”和它本身以外,还能被其他数整除的数叫合数,如:4、6、8、9.

在介绍质数、合数的概念时,我们都会追加一句:“1”既不是质数也不是合数。
有人要问,“1”也只能被1 和它本身整除,为什么不能算质数呢?而且“1”算作质数后,就不用再追加这么一句,岂不是更简单吗?
这要从分解质因数谈起。比如,1001 能被哪些数整除,其实质是将1001分解质因数,由1001=7×11×13,而且只有这一种分解结果,知道1001 除了被1 和它本身整除以外,还能被7、11、13 整除。若把“1”也算作质数,那么1001 分解质因数就会出现下面一些结果:
1001=7×11×13
1001=1×7×11×13
1001=1×1×7×11×13
……
也就是说,分解式中可随便添上几个因数“1”。这样做,一方面对求1001 的因数毫无必要,另一方面分解质因质结果不唯一,又增添了不必要的麻烦。因此“1”不算作质数。

每一个整数,或者是素数,或者是素数的乘积。

编程判断一个数是否是素数

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

int main (void)
{
    int i;
    scanf("%d", &i);
    if ( isPrime( i )){
        printf("%d is prime", i );
    } else {
        printf("%d is not prime", i );
    }
    return 0;
}
int isPrime ( int i )
{
    int n;
    for ( n = 2; n <= (int)sqrt(i); n++ ){
        if ( i % n == 0 ){
            return 0;
        }
    }
    return 1;
}

明白了!你说的“不是质素数”,应该是说: > 判断一个是否是**素数(质)**,而不是合。 我们来重新梳理一下你的原始代码意图: 你希望判断一个是否是**素数**(即质),而你的函 `haha` 实际上是判断一个是否是**合**(非质),所以逻辑是反的。 --- ## ✅ 正确判断素数的函(优化版) ```c #include <stdio.h> #include <stdbool.h> #include <math.h> // 判断一个是否为素数 bool is_prime(int a) { if (a < 2) return false; // 01都不是素数 int sqrt_a = (int)sqrt(a); // 只需要检查到平方根即可 for (int i = 2; i <= sqrt_a; i++) { if (a % i == 0) return false; // 能整除则不是素数 } return true; } ``` > **说明**: - 时间复杂度从原来的 `O(a/2)` 优化到 `O(√a)`。 - 更加高效,尤其在处理大时提升明显。 --- ## ✅ 修正主函逻辑 你原来的主函中,有一个 `while(k--)` 的写法是错误的,因为 `k` 是在循环中被递减的,导致第一次循环后 `k` 就变成 0,后续循环无法再进入。 我们来修正整个逻辑,使用**滑动窗口**或**前缀**来高效地处理连续 `k` 个元素的。 ### ✅ 改进后的完整代码 ```c #include <stdio.h> #include <stdbool.h> #include <math.h> bool is_prime(int a) { if (a < 2) return false; int sqrt_a = (int)sqrt(a); for (int i = 2; i <= sqrt_a; i++) { if (a % i == 0) return false; } return true; } int main() { int n, k; scanf("%d%d", &n, &k); int a[n]; // 输入组 for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } int count = 0; // 对每个起点 i,计算连续 k 个元素的(循环组) for (int i = 0; i < n; i++) { int sum = 0; for (int j = 0; j < k; j++) { int index = (i + j) % n; // 循环取 sum += a[index]; } if (is_prime(sum)) { count++; } } printf("%d\n", count); return 0; } ``` > **说明**: - `is_prime` 函用于判断是否是素数。 - 每次从位置 `i` 开始,取 `k` 个元素(循环组),求后判断是否为素数。 - 总时间复杂度为 `O(n * k + n * √sum)`,在合理范围内。 --- ## ✅ 示例 输入: ``` 5 2 2 3 5 7 11 ``` 输出: ``` 5 ``` 说明:所有连续两个都是素数。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值