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编辑  收藏  举报

导航