C 语言实现素数对计数:程序分析及优化

以下程序旨在计算小于等于输入整数的素数对数量,但输出结果始终为 0。本文将分析代码,解释程序输出 0 的原因,并提供优化方案。

代码分析

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

int isPrime(int n)
{
    if(n<=1)
    return 0;

    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        return 0;
    }

    return 1;

}


int main()
{
    int n=0;int j=0;
    scanf("%d",&n);
    int *array=(int *)malloc(n*sizeof(int));
    for(int i=2;i<=n;i++)
    {
        if(isPrime(i))
        {
            
            array[j]=i;
            j++;
        }
    }

    int count=0;
    for(int k=0;k<j-1;k++)
    {
        if((array[k+1]-array[k])==1&&(array[k+1]-array[k])%2==0)
        {
            count++;
        }
    }

    printf("%d",count);
    free(array);

}

程序输出 0 的原因

在计算 count 的过程中,只有当两个连续的素数差为 1 且为偶数时,count 才会增加。然而,在给 array 数组赋值时,并没有保证 array 数组中的素数是按照从小到大的顺序排列的,因此可能会存在连续的素数差不为 1 的情况,导致 count 始终为 0。

优化方案

为了确保连续的素数差为 1,需要对 array 数组进行排序。可以使用冒泡排序等算法对 array 数组进行排序,然后按照排序后的结果进行 count 的计算。

优化后的代码

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

int isPrime(int n)
{
    if(n<=1)
    return 0;

    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        return 0;
    }

    return 1;

}


int main()
{
    int n=0;int j=0;
    scanf("%d",&n);
    int *array=(int *)malloc(n*sizeof(int));
    for(int i=2;i<=n;i++)
    {
        if(isPrime(i))
        {
            
            array[j]=i;
            j++;
        }
    }

    // 对 array 数组进行排序
    for(int i=0;i<j-1;i++)
    {
        for(int k=0;k<j-i-1;k++)
        {
            if(array[k]>array[k+1])
            {
                int temp=array[k];
                array[k]=array[k+1];
                array[k+1]=temp;
            }
        }
    }

    int count=0;
    for(int k=0;k<j-1;k++)
    {
        if((array[k+1]-array[k])==1&&(array[k+1]-array[k])%2==0)
        {
            count++;
        }
    }

    printf("%d",count);
    free(array);

}

总结

通过对程序进行分析和优化,解决了程序输出 0 的问题。优化后的代码能够正确计算小于等于输入整数的素数对数量。


原文地址: https://www.cveoy.top/t/topic/p3re 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录