7-4 (有注释)求n以内最大的k个素数以及它们的和 (20分)

本题要求计算并输出不超过n的最大的k个素数以及它们的和。

输入格式:

输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。

输出格式:

在一行中按下列格式输出:

素数1+素数2++素数k=总和值

其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。

输入样例1:

1000 10

输出样例1:

997+991+983+977+971+967+953+947+941+937=9664

输入样例2:

12 6

输出样例2:

11+7+5+3+2=28

我的代码:

// 关于一组输出不是那种连续类似的,可以控制输出,让一个小
// 的地方输出后,打开另一个地方,下次从该点输出,并关闭自身入口 

// 本题我运用的是验证到平方根的方法。
// 其他方法当然也行。
 
#include <stdio.h>
#include <math.h>
int main()
{
    
    
	int i,n,k,p=1,o=1,z,sum=0,y=0;
	scanf("%d %d",&n,&k);               // 读入数据。 
	for(i=n;i>=2;i--)                   // 判断是否为素数。 
	{
    
    
		int zhongd = (int)sqrt(i);
		for( z=2;z<=zhongd;z++)
		{
    
    
			if(i%z==0)
			{
    
    
				break;
			}
		}
		if(z==zhongd+1&&k>0)            // 注意这个条件,只有当 z == zhongd 时, 
		{
    
                                   // 才是素数,才有资格进入下一步。 
			if(y)                       // 这一步前面有+,显然是不能先输出的。 
			{
    
    
				printf("+%d",i);
				sum+=i;                 // sum 记录总和。 
				k--;
			}
			if(o)                       // 这一步因为没有+,所以后面几步不可能再用 
			{
    
                               // 所以必须用过后关闭入口,并打开上方入口。 
				printf("%d",i);
				k--;
				sum+=i;                 // sum 记录总和。 
				o=0;
				y=1;
			}
			
		}
		if(k<=0)                        // 这是应对在给定数字内,素数找够的情况。 
		{
    
    
			p=0;                        // 同时外面的不足情况也就不需要执行了。 
			printf("=%d",sum);
			break;
		}
	}
	if(p)
		{
    
    
			printf("=%d",sum);          // 应对素数不足,被迫跳出循环的情况。 
		}
}

我又想到一种方法,当 k == 原数值时,执行 %d ,否则,执行 +%d ,这个和上一个比没啥,但是省去了变量数量,思考也更简单。

// 关于一组输出不是那种连续类似的,可以控制输出,让一个小
// 的地方输出后,打开另一个地方,下次从该点输出,并关闭自身入口 

// 本题我运用的是验证到平方根的方法。
// 其他方法当然也行。
 
#include <stdio.h>
#include <math.h>
int main()
{
    
    
	int i,n,k,p=1,z,sum=0,y=0;
	scanf("%d %d",&n,&k);               // 读入数据。 
	y=k; 
	for(i=n;i>=2;i--)                   // 判断是否为素数。 
	{
    
    
		int zhongd = (int)sqrt(i);
		for( z=2;z<=zhongd;z++)
		{
    
    
			if(i%z==0)
			{
    
    
				break;
			}
		}
		if(z==zhongd+1&&k>0)            // 注意这个条件,只有当 z == zhongd 时, 
		{
    
                                   // 才是素数,才有资格进入下一步。 
			
			if(k==y)                       // 这一步因为没有'+',所以后面几步不可能再用 
			{
    
                               // 所以必须用过后关闭入口,并打开上方入口。 
				printf("%d",i);
				k--;
				sum+=i;                 // sum 记录总和。 
			}
			else                     // 这一步前面有'+',显然是不能先输出的。 
			{
    
    
				printf("+%d",i);
				sum+=i;                 // sum 记录总和。 
				k--;
			}
		}
		if(k<=0)                        // 这是应对在给定数字内,素数找够的情况。 
		{
    
    
			p=0;                        // 同时外面的不足情况也就不需要执行了。 
			printf("=%d",sum);
			break;
		}
	}
	if(p)
		{
    
    
			printf("=%d",sum);          // 应对素数不足,被迫跳出循环的情况。 
		}
}

博主初学小白,今天看好像没有人给出比较适合新手的代码,故此下笔,如有谬误,还望告知,以免误导后来者,最后求个赞!

猜你喜欢

转载自blog.csdn.net/weixin_51304266/article/details/110436988