《C語言名題精選百則----8》


題目不是很難,但是像這本書上大部分的題目一樣,解決很容易,但是寫好很難。

先上我的答案:(源碼無法正常顯示的話就點擊右鍵->查看源文件)

#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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章