扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
#includestdio.h
成都创新互联公司主营夷陵网站建设的网络公司,主营网站建设方案,app软件开发公司,夷陵h5小程序开发搭建,夷陵网站营销推广欢迎夷陵等地区企业咨询
#includemath.h
int isPrime(int n) ///是素数返回1,否则返回0
{
int i,k;
k = (int)sqrt(n);
for(i = 2; i = k;i++)
{
if(n % i == 0)
break;
}
if(i k)
return 1;
else
return 0;
}
void main()
{
int n,i,k,sum=0;
printf("输入大于等于1的整数:n\n");
scanf("%d",n);
for(i=1;i=n;i++)
{
if (isPrime(i)==1)
{
sum+=i;
}
}
printf("%d",sum);
}
这个问题可以分成两部分解决,一个是判断素数,另一部分是实现累加和输出。
一、判断素数。
有以下两种常见的判断素数的方法。
1 通过数学定义判断,即查找所有因子,如果存在除1及本身以外因子,则非素数。
代码如下:
#include math.h//用到开平方函数,引用对应的数学头文件
int is_prime(int n)
{
int i;
for(i = 2; i = (int)sqrt(n); i ++)//根据数学定义,除本身外,其它因子不可能比平方根更大,所以只需要判断不大于平方根的值即可。其中sqrt为求平方根函数。
if(n%i==0) return 0; //只要有一个符合条件的因子,则非素数,返回0。
return 1; //该数为素数。
}
这个算法可以应用于任何情况。
2 素数筛。
这种算法的原理是,所有素数的倍数都不是素数。
先假定所有数均为素数,然后去掉已知素数的倍数,最终得到一定范围内所有素数。
代码如下:
int map[100];//数据规模,这里使用题目中的100,实际上应该是标记0-100,也就是101个单位,但是100是已知的非素数,所以用100个元素就足够了。
void make_map(void)
{
int i,j;
map[1] = 1; //1 不是素数。
for(i = 2; i 100; i ++)
{
if(map[i])continue; //对于已知的非素数,不做处理
for(j = i*2; j 100; j +=i)
map[j] = 1;
}
}
int is_prime(int n)
{
if(map[1] == 0) make_map(); //如果1没有被标记为非素数,那么表示map没有生成,需要生成map。
return map[n] == 0; //如map[n]为0,则n为素数
}
这种算法空间开销与数据规模成正比,当数据规模比较大时并不适用。
但对于数据规模小且素数判断频繁的情况,具有更高的时间开销优势。
二、累加。
这部分可以放置于主函数。调用上述任意一种素数判断函数皆可。
#include stdio.h
int main()
{
int sum = 0;//累加结果
int i;
for(i = 2; i 100; i ++)
if(is_prime(i))sum+=i;//累加素数。
printf("sum = %d\n", sum);//输出结果。
}
最终输出sum=1060
void main()
{
int i,j,n,sum=0;
scanf("%d",n);
i=n; //从n开始检查
while(n0)
{
if(prime(i)!=0) //是素数
{
sum=sum+i; //加上i
n--; //个数减1
}
i++; //取下一个数
}
printf("%d",sum);
}
网上的代码意思是:n就是你输入的任意数,判断它是否是素数的方法是用大于2小于n的数去除n,若能整除即不是素数,跳出循环;若数一直增加到n+1都没有被整除,即可输出“素数”。
你的源程序:3是素数,很简单,所以用if来提醒输入大于3的数,你的只是另一种素数算法,是优化的算法,更快。因为只需用2到根号a去判断。
#includestdio.h
#includemath.h
int lsPrime(int n);
int main()
{
int n, i, k, sum = 0;
printf("input n:\n");
scanf("%d", n);
for (i = 1; i = n; i++)
{
if (lsPrime(i) == 1)
{
sum += i;
}
}
printf("sum=%d\n", sum);
return 0;
}
int lsPrime(int n) ///是素数21135261返回410216531,否则返回0
{
int i, k;
k = (int) sqrt(n);
for (i = 2; i = k; i++)
{
if (n % i == 0)
break;
}
if (i k n 1)
return 1;
else
return 0;
}
按照你的要求编写的C语言程序如下
#includestdio.h
int f(int x) //定义判断素数的函数
{
int n,flag=1;
if(x==1) return 0;
for(n=2;nx;n++)
if(x%n==0)
flag=0;
return flag;
}
int main()
{
int i,N,M,count=0,sum=0;
scanf("%d%d",N,M);
for(i=N;i=M;i++){
if(f(i)==1){
count++;
sum=sum+i;
}
}
printf("%d到%d之间共有%d个素数,它们的和为%d",N,M,count,sum);
return 0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流