浙大版《C语言程序设计(第3版)》练习4-11 统计素数并求和 (20分)

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:

10 31

输出样例:

7 143

我的代码:一遍过20/20
注意点:m1;以及m1&&n==1;
我的代码是在main函数中设一个if来判断,优质代码可以直接在f函数中,if(cnt==0&&i!=0);

p1我原始代码(满分)p2我改良代码(满分)p3继续优化f函数的判断条件(满分)

p1

#include 
/*本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。*/
int f(int i);
int main(void){
	int m,n,i,cnt1=0,sum=0;
	scanf("%d%d",&m,&n);
	if(m==1&&n==1){
		sum=0;cnt1=0;
	}else {
		if(m==1){
			m=2;
		}
		for(i=m;i<=n;i++){
		if(f(i)){
			sum+=i;
			cnt1++;
		    }
      	}	
	}

	printf("%d %d",cnt1,sum);
	return 0;
} 
int f(int i){
	int x,cnt=0;
	for(x=2;x<i;x++){
		if(i%x==0){
			cnt++;
		}
	} 
	if(cnt==0){
		return 1;
	}else return 0;
	
}

p2

#include 
/*本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。*/
int f(int i);
int main(void){
	int m,n,i,cnt1=0,sum=0;
	scanf("%d%d",&m,&n);
		for(i=m;i<=n;i++){
		if(f(i)){
			sum+=i;
			cnt1++;
		    }
      	}	

	printf("%d %d",cnt1,sum);
	return 0;
} 
int f(int i){
	int x,cnt=0;
	for(x=2;x<i;x++){
		if(i%x==0){
			cnt++;
		}
	} 
	if(cnt==0&&i!=1){
		return 1;
	}else return 0;
	
}


p3:

①把原来的计数器cnt改成了flag来判断,好处:不用做加法,直接选择赋值,避免了计算机没必要的加法步骤, ②当出现i%x==0时就break,免去了多余的循环。

#include 
/*本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。*/
int f(int i);
int main(void){
	int m,n,i,cnt1=0,sum=0;
	scanf("%d%d",&m,&n);
		for(i=m;i<=n;i++){
		if(f(i)){
			sum+=i;
			cnt1++;
		    }
      	}	

	printf("%d %d",cnt1,sum);
	return 0;
} 
int f(int i){
	int x,flag=1;//是素数。 
	for(x=2;x<i;x++){
		if(i%x==0){
			flag=0;
			break;
		}
	} 
	if(flag==1&&i!=1){
		return 1;
	}else return 0;
	
}

你可能感兴趣的:(PTA)