需求:设计一个程序,输出所有小于等于n(n为一个大于2的正整数)的素数。(1)每行输出10个素数;(2)尽可能采用较优的算法。
我写的程序:
#include<stdio.h>
#include<math.h>
/*
*函数名:primeNumber
*返回值:void
*功能:打印小于或等于n的素数
*参数:int ,传入int型n
*/
void primeNumber(int n)
{
int m=0;
int i,j;
if(n<=2)
{
printf("输入的数不符合");
return;
}
for(i=2;i<=n;i++)
{
for(j=2;j<=(int)sqrt(i);j++)
{
if(i%j==0) break;
}
if(j>(int)sqrt(i))
{
printf(" %-4d ",i);
m++;
if(m%10==0)
{
printf("\n");
}
}
}
}
void main()
{
int n;
printf("请输入一个大于2的正整数\n");
scanf("%d",&n);
printf("小于或等于%d的素数有:\n",n);
primeNumber(n);
printf("\n");
}
运行没有问题,但是没有做到较优的算法。
书本(《数据结构教程(第3版)上机实验指导》)的代码
#include<stdio.h>
#include<math.h>
int prime(int x)
{
int i;
for(i=2;i<=(int)sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}
void main()
{
int n,i,j=0;
printf("n:");
scanf("%d",&n);
printf("小于等于%d的素数:\n",n);
if (n>2)
{
printf("%4d",2);
j++;
}
for (i=3;i<=n;i++)
if (prime(i)==1)
{
printf("%4d",i);
if (j!=0 && ++j%10==0)
printf("\n");
}
printf("\n");
}
因为大于2的偶数肯定不是素数,所以只对奇数判断,这样时间复杂度就会降低。
还有i<=(int)sqrt(x);不能漏掉等号,书本就漏掉了,导致9,15,25都被认为是素数。