C 语言实现素数对计数:程序分析及优化
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 著作权归作者所有。请勿转载和采集!