问题解决:
本题要求计算并输出不超过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
解题思路: (思路我已经备注在代码块中辣)
1.利用数组来存储k个素数
int arr[20]; //利用数组来储存K个素数
2.利用循环递减找出k个素数
for(j=n;j>1;j--) //其中素数按递减顺序输出,所以倒着循环寻找k个素数
{
for(i=2;i<=sqrt(j);i++)
{ //确定j是否为素数
if(j%i==0)
break;
}
if(m>=k)//根据题意存k个素数,如果存够了,跳出循环
break;
if(i>sqrt(j))//如果j为素数,将其存入数组
{
arr[m]=j;
m++; //m=0开始计数,存一个素数,m+1,(直到m=k-1)
}
}
3. 利用数组来计算
for(t=0;t<=m-1;t++)
{ //把存在数组中的k个素数想办法拿出来
sum+=arr[t];//数组中的k个素数求和
if(t<m-1)
printf("%d+",arr[t]);
else
printf("%d",arr[t]);
}
printf("=%d",sum);
总 代 码
#include<stdio.h>
int main()
{
int n,k,i,j;
int m=0,sum=0,t=0;
int arr[20]; //利用数组来储存K个素数
scanf("%d%d",&n,&k);
for(j=n;j>1;j--) //其中素数按递减顺序输出,所以倒着循环寻找k个素数
{
for(i=2;i<=sqrt(j);i++)
{ //确定j是否为素数
if(j%i==0)
break;
}
if(m>=k)//根据题意存k个素数,如果存够了,跳出循环
break;
if(i>sqrt(j))//如果j为素数,将其存入数组
{
arr[m]=j;
m++; //m=0开始计数,存一个素数,m+1,(直到m=k-1)
}
}
for(t=0;t<=m-1;t++)
{ //把存在数组中的k个素数想办法拿出来
sum+=arr[t];//数组中的k个素数求和
if(t<m-1)
printf("%d+",arr[t]);
else
printf("%d",arr[t]);
}
printf("=%d",sum);
return 0;
}