1.素数
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
2.试除法
下面我给大家介绍一下素数求解常用的试除法,其核心思想就是判断大于1小于x之间的所有数是否可以被整除,如果可以为合数,否则为素数。
1.依次判断2~n-1之间的所有整数
#include <stdio.h>
#include <stdlib.h>
int main()
{
  int i = 0;
  int j = 0;
  int count = 0;
  for (i = 100; i <= 200; i++)
  {
    for (j = 2; j < i; j++)
    {
      if (i%j == 0)
      {
        break;
      }
    }
    if (j == i)
    {
      printf("%d是素数\n", i);
      count++;
    }
  }
  printf("count=%d\n", count);
  system("pause");
  return 0;
}2.由于素数为奇数,所以我们可以去除范围内的偶数
#include <stdio.h>
#include <stdlib.h>
int main()
{
  int i = 0;
  int j = 0;
  int count = 0;
  for (i = 101; i <= 200; i += 2)
  {
    for (j = 2; j < i; j++)
    {
      if (i%j == 0)
        break;
    }
    if (j == i)
    {
      printf("%d是素数\n", i);
      count++;
    }
  }
  printf("count=%d\n", count);
  system("pause");
  return 0;
}3.由于素数是只能被1和本身整除,且因数是成对出现的,所以我们只需要判断2~sqrt(n)之间的奇数即可
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
  int i = 0;
  int count = 0;
  for (i = 101; i <201; i += 2)
  {
    int j = 0;
    for (j = 2; j <= sqrt(i); j++)
    {
      if (i%j == 0)
      {
        break;
      }
    }
    if (j>sqrt(i))
    {
      printf("%d是素数\n", i);
      count++;
    }
  }
  printf("count=%d\n", count);
  system("pause");
  return 0;
}4.除了2以外,所有可能的质因数都是奇数,先计算2,再计算3~i/2之间的所有奇数
#include <stdio.h>
#include <stdlib.h>
int main()
{
  int i = 0;
  int j = 0;
  int count = 0;
  for (i = 101; i <= 200; i += 2)
  {
    for (j = 2; j < i / 2; j++)
    {
      if (i%j == 0)
        break;
    }
    if (j == i / 2)
    {
      printf("%d是素数\n", i);
      count++;
    }
  }
  printf("count=%d\n", count);
  system("pause");
  return 0;
}3.筛选法
用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的 数是素数,然后去掉它的倍数。依次类推,直到“筛子”为空时结束。如有: 1-100的数
1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,就是去掉4,6,8,10,12,14,16,18….
   剩下的数中3最小,是素数,去掉3的倍数,就是去掉6,9,12,15,18,21,24.....
   ...
   ...
   依次去掉2-10的倍数
   直到所有的数都被筛完,求出的素数为:  2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97代码实现:
#include<stdio.h>
int main()
{
    int a[101]={0};            //存储1-100
    int i=0;
    int j=0;
    int k=0;
    for(i=2;i<=10;i++)         //从2-10作为最小值开始筛选
    {
        for(j=2;j*i<101;j++)   //找出最小数的倍数
        {
            a[i*j]=1;          //把最小数的倍数赋值1
        }
    }
    for(k=2;k<101;k++)        //因为1不是素数,所以从2开始遍历输出素数
    {
        if(a[k]==0)            //在a数组中如果数组元素是0,那么相应下标就是素数
        {
            printf("%3d",k);
        }
    }
    return 0;
}利用函数实现:
#include<stdio.h>
void my_fun(int a[])
{
  int i = 0;
  int j = 0;
  int k = 0;
  for (i = 2; i <= 10; i++)     //从2-10作为最小值开始筛选
  {
    for (j = 2; j*i<101; j++) //找出最小数的倍数
    {
      a[i*j] = 1;           //把最小数的倍数赋值1
    }
  }
  for (k = 2; k<101; k++)       //因为1不是素数,所以从2开始遍历输出素数
  {
    if (a[k] == 0)             //在a数组中如果数组元素是0,那么相应下标就是素数
    {
      printf("%3d是素数\n", k);
    }
  }
}
int main()
{
  int a[101] = { 0 };          //存储1-100
  my_fun(a);
  return 0;
}









