題目不是很難,但是像這本書上大部分的題目一樣,解決很容易,但是寫好很難。
先上我的答案:(源碼無法正常顯示的話就點擊右鍵->查看源文件)
#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