#include<stdio.h>
int n;
int sum1(int n)/*递归求1+2+....+n*/
{
if(n==0)return 0;
return n+sum1(n-1);
}
int insprime(int n)//判断是否是素数
{
if(n<=1)return false;
for(int i=2;i<n;i++)
if(!(n%i))return false;
return true;
}
int sum2()//求1到n素数和
{
int sum=0;
for(int i=1;i<=n;i++)
if(insprime(i))
sum+=i;
return sum;
}
void main()
{
printf("输入要求和的n\n");
scanf("%d",&n);
int k=sum1(n);
printf("所求和为:%d\n",k);
k=sum1(n)-sum2();
printf("1到n非素数和为:%d\n",k);
}
看看我的能不能再简单点???
看看我前面的能不能简单点?
追答在递归求前n项和的时候同时求其中的素数和,这样就无需另外再次求和,可提高效率
#include
int sum2=0;
int insprime(int n)//判断是否是素数
{
if(n<=1)return false;
for(int i=2;i<=n/2;i++)//测试i到n/2即可,减少运行时间
if(!(n%i))return false;
return true;
}
int sum1(int n)/*递归求1+2+....+n*/
{
if(n==1)return 1;//到1即可无需到0
if (insprime(n))sum2+=n;//求素数和
return n+sum1(n-1);
}
void main()
{
int n;
printf("输入要求和的n\n");
scanf("%d",&n);
int k=sum1(n);
printf("所求和为:%d\n",k);
k=k-sum2;
printf("1到%d非素数和为:%d\n",n,k);
}