C:素数
1.判断
i从2开始递增,让num取余除自身和1以外所有正整数,如果取余为0,flag标志为1,表示非素数,如果取余全都不为1,表示素数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num,i,flag = 0;
scanf("%d",&num);
for (i= 2; i < num; i++)
{
if(num % i == 0)
{
flag = 1; //通过flag来标识是否有质数
break;
}
}
if (flag == 1)
{
printf("%d不是素数",num);
}
else
{
printf("%d是素数",num);
}
return 0;
}
判断的核心为循环除以2到非自身的所有数,如果没有余数则flag为1,枚举完后如果flag仍然为0,说明为质数
2.如果要求输出的是第n个到第m个质数的和
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x;
int n,m;
int sum = 0, cnt = 0;
scanf("%d %d",&n, &m);
for (x=2; x<10000; x++)
{
int i;
int isPrime = 0;
for (i=2; i<x; i++)
{
if (x%i == 0)
{
isPrime = 1;
break;
}
}
if (isPrime == 0)
{
cnt += 1;
}
if (isPrime == 0 && cnt >= n && cnt <= m)
{
sum += x;
}
}
printf("%d",sum);
}
核心代码是通过cnt计数,如果cnt达到输入n-m的范围,则累加
在这里关键为通过x=2开始累加,来一一枚举
优化:①我们知道素数都不是偶数,这样的话可以添加if else语句,当偶数时直接flag置位,for循环中i=i+2,循环的次数减少一半
②由数学推论可以得知,i不需要走到x-1,走到sqrt(x)就可以
更好的优化:
③只需要除素数除不尽即可,使用数组的方式
if (isprime(i, prime, count)) //先判断是否为质数,是的话放入数组中
prime[cnt++] = i //将质数放入数组中去
posted on 2019-05-06 20:09 zhaoy_shine 阅读(159) 评论(0) 编辑 收藏 举报