本题要求计算并输出不超过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); // 应对素数不足,被迫跳出循环的情况。
}
}
博主初学小白,今天看好像没有人给出比较适合新手的代码,故此下笔,如有谬误,还望告知,以免误导后来者,最后求个赞!