C 如何正确编写素数代码?

C 如何正确编写素数代码?,c,C,我试着写一个代码来获取大量案例的输入,并为每个案例预测它是否是素数。我编写了以下代码,但输出不正确。代码是: #include <stdio.h> int main() { int k,m; long long int arr[k]; int n, i, flag = 0; scanf("%d", &k); for(m=0;m<k;++m) { scanf("%lld&quo

我试着写一个代码来获取大量案例的输入,并为每个案例预测它是否是素数。我编写了以下代码,但输出不正确。代码是:

#include <stdio.h>
int main() 
{
    int k,m;
    long long int arr[k];
    int n, i, flag = 0;
    scanf("%d", &k);
    for(m=0;m<k;++m)
    {
        scanf("%lld", &arr[m]);
        for (i = 2; i <= arr[m] / 2; ++i) 
        {
          if (arr[m] % i == 0) 
            flag = 1;
    
          if (flag == 0)
            printf("Yes\n");
          else
            printf("No\n");
        }
    }
}
#包括
int main()
{
int k,m;
长整数arr[k];
int n,i,flag=0;
scanf(“%d”和“&k”);
对于(m=0;m
  • long-long-int-arr[k];
    应该在
    scanf(“%d”、&k);
    之后,以便将输入帐户正确地考虑到分配大小中
  • 标志
    应为每个NUNBER初始化
  • 结果输出应该在循环完成之后。您应该正确使用缩进
  • 小于2的整数不是素数
  • 奇怪的是,
    i
    int
    ,而
    arr[m]
    long-long-int
固定代码:

#include <stdio.h>
int main() 
{
    int k,m;
    int n, flag = 0;
    scanf("%d", &k);
    long long int arr[k], i;
    for(m=0;m<k;++m)
    {
        scanf("%lld", &arr[m]);
        flag = 0;
        for (i = 2; i <= arr[m] / 2; ++i) 
        {
            if (arr[m] % i == 0) 
            {
                flag = 1;
            }
        }
    
        if (arr[m] >= 2 && flag == 0)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

主要有三个问题:

  • 在从用户获得大小之前,您正在分配可变长度数组
    arr

  • 每次迭代后都不会重置
    标志

  • 只有在测试了
    arr[m]
    的所有可能的除数后,才应打印是或否

  • 也就是说,让我们改进您的代码:

    首先,我们根本不需要数组

    int main() {
        int numbers_to_test;
    
        scanf("%d, &numbers_to_test);
    
        for (int i=0; i < numbers_to_test; i++) {
            long long int number_to_test;
            scanf("%lld", &number_to_test);
    
            int flag = 0;
            for (int divisor = 2; divisor <= number_to_test / 2; ++divisor) {
                if (number_to_test % divisor == 0) {
                    flag = 1;
                }
            }
        
            if (flag == 0)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    
    intmain(){
    整数对整数检验;
    scanf(“%d,&个数到个数测试);
    对于(int i=0;i对于(整型除数=2;除数以,
    long-long-int-arr[k]开头;
    应在
    scanf(“%d”,&k)之后)
    。看起来你所做的一切就是确定一个数字是偶数还是奇数。你必须为每个候选
    m
    重置
    标志。你的
    标志测试除了上面指出的其他固定标志外,还需要移到循环之外。你还应该在设置
    标志后尽快从循环中中断
    1
    ,因为此时没有理由继续测试潜在的除数。您的代码将错误地将
    1
    判断为素数。还要注意,
    之后缺少
    ,%d
    i
    未在
    iPrime
    中定义。(备注:
    #include
    应用于使
    bool
    true
    false
    可用)
    int main() {
        int numbers_to_test;
    
        scanf("%d, &numbers_to_test);
    
        for (int i=0; i < numbers_to_test; i++) {
            long long int number_to_test;
            scanf("%lld", &number_to_test);
    
            int flag = 0;
            for (int divisor = 2; divisor <= number_to_test / 2; ++divisor) {
                if (number_to_test % divisor == 0) {
                    flag = 1;
                }
            }
        
            if (flag == 0)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    
    bool isPrime(long long int number_to_test) {
        if (number_to_test <= 1)
            return false;
        for (long long int divisor = 2; divisor <= number_to_test / 2; ++divisor)
            if (number_to_test % divisor == 0)
                return false;
        return true;
    }
        
    int main() {
        int numbers_to_test;
        scanf("%d", &numbers_to_test);
    
        for (int i=0; i < numbers_to_test; i++) {
            long long int number_to_test;
            scanf("%lld", &number_to_test);
        
            if (isPrime(number_to_test))
                printf("Yes\n");
            else
                printf("No\n");
        }
    }