《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


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值