C-使用数组打印从1到100的所有素数

时间:2018-12-29 17:04:59

标签: c arrays syntax

好的,所以我遇到了这个挑战,我必须将所有素数从1打印到100 ...但是我的代码中有一个我找不到的错误,这就是我认为应该解决的方式: 对于从3到100的任何数字,请检查primes数组中是否还有其他数字,用thay除以它。如果有,则不是质数...如果没有,则应将其加到数组中。简单吧? 但是...不起作用..这是我的代码:

#include <stdio.h>

int main()
{
    int Primes[50] = {0};
    int i,j,k;

    Primes[0]=2;
    Primes[1]=3;
    for(i=3;i<101;i++)
    {
        for(j=2;j<100;j++)
        {
            if(i % Primes[j] != 0 && Primes[j] !=0)
            {
                Primes[j]=i;
            }
        }
    }
    printf("Primes array : \n");
    for(k=0;k<51;k++)
    {
        printf("%d ", Primes[k]);
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

我们可以假设魔术数不是25 ...即k!= 25,我们可以 将其替换为i <= 100。

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

int main(void){
    int Primes[50] = {0};
    int i,j,k  = 0;
    Primes[0]=2;
    Primes[1]=3;

    for(i=0; i<=100; i++) {
        for(j = 2; j<=i; j++) {
            if(i % j == 0 ){
                if(i == j)
                    Primes[k++]=i;
                break;
            }
        }
    }

    printf("Primes array : \n");

    for(int index = 0;index < k; index++) {
        printf("%d\n", Primes[index]);
    }

    return 0;   
}

答案 1 :(得分:0)

执行此操作时:

        if(i % Primes[j] != 0 && Primes[j] !=0)
        {
            Primes[j]=i;
        } 

您说的是“如果当前数字不能被给定的素数整除,请用当前数字替换给定的素数”。这不是你想要的。

您需要检查当前数字是否不能被任何质数整除。因此,您需要遍历素数列表以确保您的数字不能被素数整除,如果是,则将其添加到列表末尾。您可以按照以下步骤进行操作:

int num_primes = 0;

for (i=2;i<101;i++)
{
    int is_prime = 1;
    for(j=0; j<num_primes && is_prime; j++)
    {
        if(i % Primes[j] == 0)
        {
            is_prime = 0;
        }
    }
    if (is_prime) {
        Primes[num_primes++] = i;
    }
}

在上面的代码中,我们使用num_primes来计算到目前为止的素数,并使用is_prime来查看是否发现了将当前数除的素数。将每个数字除以质数时,如果余数为0,则知道该数字不是质数,并将is_prime设置为0。这也会导致内部循环立即退出。然后,如果is_prime仍设置在内循环的末尾,则您有一个质数并将其添加到列表的末尾。

在打印循环中您还会遇到一个错误:

for(k=0;k<51;k++)

由于Primes的大小为50,因此最大的有效索引为49。因此将其更改为:

for(k=0;k<50;k++)

答案 2 :(得分:0)

您使用的算法存在很多问题。将此简单版本用于代码中解决的问题。

int main(void){

        int Primes[50] = {0};
        int i,j,k = 0 /* use for prime count purpose */;
        Primes[0]=2;
        Primes[1]=3;
        for(i=4 /* 3 is already stored */; k != 48; i++) { /* rotate loop until prime count doesn't reaches 48 */
                for(j = 2; j<=i; j++) { /* i is the number you want to check whether its prime or not. SO rotate loop from 2 to "i" */
                        if(i % j == 0){ /* use i%j not i % Primes[j] as you want to check whether i is prime or not */
                                if(i == j)  /* if its a prime numbur j reaches upto i */
                                        Primes[k++]=i; /* store it */
                                break; /* comes out of inner loop */
                        }
                }
        }
        printf("Primes array : \n");
        for(int index = 0;index < k; index++) { /* rotate k times not some random 51 times */
                printf("%d ", Primes[index]);
        }
        return 0;
}

答案 3 :(得分:0)

上面的代码实际上并没有提供我们想要的,但是仍然是漂亮的代码。这是经过编辑的代码,其素数从 1到100

int main(void){

    int Primes[50] = {0};
    int i,j,k = 0 /* use for prime count purpose */;
    Primes[0]=2;
    Primes[1]=3;
    for(i=0 /* 3 is already stored */; k != 25; i++) { /* rotate loop until prime count doesn't reaches 48 */
            for(j = 2; j<=i; j++) { /* i is the number you want to check whether its prime or not. SO rotate loop from 2 to "i" */
                    if(i % j == 0){ /* use i%j not i % Primes[j] as you want to check whether i is prime or not */
                            if(i == j)  /* if its a prime numbur j reaches upto i */
                                    Primes[k++]=i; /* store it */
                            break; /* comes out of inner loop */
                    }
            }
    }
    printf("Primes array : \n");
    for(int index = 0;index < k; index++) { /* rotate k times not some random 51 times */
            printf("%d\n", Primes[index]);
    }
    return 0;

}