题目不是很难,但是像这本书上大部分的题目一样,解决很容易,但是写好很难。
先上我的答案:(源码无法正常显示的话就点击右键->查看源文件)
#include<stdio.h>
void srh(int n);
void testIfPri(int a[],int *length,int n);
int main()
{
int n;
printf("Input the top range N (0 - N) : ");
scanf("%d",&n);
srh(n);
return 0;
}
void srh(int limit)
{
int a[100] = {2,3,5};
int length = 3;
int testnum;
int count;
if(limit < 7)
return;
for(testnum = 7;testnum < limit;testnum += 2)
{
if(testnum / 3 == 0)
continue;
else
testIfPri(a,&length,testnum);
}
printf("The primer between 0 and %d is \n",limit);
for(count = 0;count < length;count++)
{
if(a[count] != 0)
printf("%d\t",a[count]);
}
printf("\n");
}
void testIfPri(int a[],int *length,int n)
{
int i;
for(i = 0;i < *length && a[i] * a[i] < n;i++)
{
if(n % a[i] == 0)
{
return;
}
}
++(*length);
a[*length - 1] = n;
}
下面是书上的一个名字叫bad.c的程序,但是我觉得写得和标准答案没什么差别啊。
唯一不同是标准答案是求0-100质数,而这个程序是求前100个质数,还是贴上吧。
#include<stdio.h>
#define MAXSIZE 100
#define YES 1
#define NO 0
int main()
{
int prime[MAXSIZE];
int gap = 2;
int count = 3;
int may_be_prime = 5;
int i,is_prime;
prime[0] = 2;
prime[1] = 3;
prime[2] = 5;
while(count < MAXSIZE)
{
may_be_prime += gap;
gap = 6 - gap;
is_prime = YES;
for(i = 2;prime[i] * prime[i] <= may_be_prime && is_prime;i++)
{
if(may_be_prime % prime[i] == 0)
is_prime = NO; //should to add a break
}
if(is_prime)
prime[count++] = may_be_prime;
}
printf("\nPrimer Number Genetation Program");
printf("\n================================");
printf("\nFirst %d Prime Numbers are : \n",count);
for(i = 0;i < count;i++)
{
if(i % 10 == 0)
printf("\n");
printf("%5d",prime[i]);
}
}
关于gap变量的使用是很具有创意的。
下面是标准答案:
#include<stdio.h>
#include<math.h>
#define MAXSIZE 100
#define YES 1
#define NO 0
int main()
{
int prime[MAXSIZE];
int count = 1;
int i,j,is_prime;
double sqrt_i;
prime[0] = 2;
for(i = 3;i < MAXSIZE;i++)
{
is_prime = YES;
sqrt_i = sqrt((double)i);
for(j = 0;prime[j] <= sqrt_i && is_prime;j++)
{
if(i % prime[j] == 0)
is_prime = NO;
}
if(is_prime)
prime[count++] = i;
}
printf("\nPrimer Number Genetation Program");
printf("\n================================");
printf("\nFirst %d Prime Numbers are : \n",count);
for(i = 0;i < count;i++)
{
if(i % 10 == 0)
printf("\n");
printf("%5d",prime[i]);
}
}
我多用了几个函数而已。
另外,我有一个发现,程序设计竞赛并不重视软件工程,他们只要快就可以,并不想以后是不是容易维护。从这一点上,可不可以说牺牲了可维护性换取了速度?
这个程序最好多敲几遍,加到自己的程序库中。
最后,发现了一个挺有意思的网站,大家可以帮我去踩踩。
www.gps660.com/?aceisme