我用C语言写了一个计算质数的程序,作为一个赋值语句,但是它没有运行

fhg3lkii  于 2023-03-12  发布在  其他
关注(0)|答案(3)|浏览(117)

下面是我写的代码。
请告诉我为什么我的代码没有工作,即使经过很长一段时间后执行。
我是在num = 4的条件下这么做的,我用的是最新版本的Xcode,M2 MacBook Air。

#include <stdio.h>

int main() {
    int num = 0;
    printf("Enter the number of prime numbers you want to find : ");
    scanf("%d", &num);
    int prime[num], store = 0, load = 0, dividend = 1, signal = 1, i;
    prime[0] = 2;
    while (store < num) {
        for (load = 0; load < store; load++) {
            if (dividend % prime[load] == 0) {
                signal = signal * 0;
            }
        }
        if (signal == 1) { // if 'dividend' value is a prime number, store dividend in the array of 'prime'.
           prime[store] = dividend;
           store++;
        }
        signal = 1;
        dividend++;
    }
    for (i = 0; i < num; i++) {
        printf("%d \n", prime[i]);
    }
    return 0;
}

/*
 signal == 1 : prime
 signal == 0 : not prime
 
 1. prime[load] == NALL
 2. for any value in the array 'prime', 'dividend % prime[load] != 0' //dividend is prime number
    signal * 0 
*/

开玩笑的一秒钟前,我问chatGPT这个问题。它告诉我“这个方法已经过时了。你可以使用其他方法像 * 埃拉托色尼筛 *。"但至少,如果我的代码没有问题,它必须运行。

r6vfmomb

r6vfmomb1#

存在多个问题:

  • 当您设置初始值prime[0] = 2并从dividend = 3开始时,store应初始化为1。您可以从2开始并删除prime[0]的初始化。
  • signal不是主要指示器的好名称:composite更显式。还建议在找到因子后立即中断循环。
  • 使loadcomposite局部于循环并在开始时初始化将不易出错。

以下是修改后的版本:

#include <stdio.h>

int main() {
    int num;

    printf("Enter the number of prime numbers you want to find : ");
    if (scanf("%d", &num) != 1 || num < 1)
        return 1;

    int prime[num];
    int store = 0;
    int dividend = 2;

    while (store < num) {
        int composite = 0;
        for (int load = 0; load < store; load++) {
            if (dividend % prime[load] == 0) {
                composite = 1;
                break;
            }
        }
        if (composite == 0) {
            // 'dividend' value is a prime number, store it in the array.
            prime[store] = dividend;
            store++;
        }
        dividend++;
    }
    for (int i = 0; i < num; i++) {
        printf("%d\n", prime[i]);
    }
    return 0;
}

请注意,没有必要测试所有的素因子。内部循环测试可以更改为:

for (int load = 0; dividend / prime[load] >= prime[load]; load++) {
        if (dividend % prime[load] == 0) {
            composite = 1;
            break;
        }
    }
8oomwypt

8oomwypt2#

你应该声明store = 1,因为有一个数字存储在素数数组中。我认为导致无限循环的原因是,通过声明dividend = 1将导致1进入素数数组,而每个数字都可以被1整除,导致算法检测不到更多的素数。你应该声明dividend = 3(省略2,因为已经在数组中)。

#include <stdio.h>
int main() {
    int num = 0;
    printf("Enter the number of prime numbers you want to find : ");
    scanf("%d", &num);
    int prime[num], store = 1, load = 0, dividend = 3, signal = 1, i;
    prime[0] = 2;
    while (store < num) {
        for (load = 0; load < store; load++) {
            if (dividend % prime[load] == 0) {
                signal = 0;
            }
        }
        if (signal == 1) { // if 'dividend' value is a prime number, store dividend in the array of 'prime'.
           prime[store] = dividend;
           store++;
        }
        signal = 1;
        dividend++;
    }
    for (i = 0; i < num; i++) {
        printf("%d \n", prime[i]);
    }
    return 0;
}

还有一件事signal = signal * 0等于to signal = 0

s5a0g9ez

s5a0g9ez3#

你的代码有不止一个问题。例如int prime[num] ;你应该创建动态内存分配或者使它成为int prime[常量值]。最好试着调试它:)下面是关于查找质数的简单代码示例。
programiz.com/c-programming/examples/prime-number

相关问题