C/C++,筆試面試,多種方法求100以內的所有素數

 使用C語言編寫程序,求1到100之間的素數(還有另一種求素數:求前100個素數)。
1.每個數試除到√x
2.將素數保存,讓後面的數整除保存的素數
3.篩選:依次刪除範圍中的2的倍數、3的倍數、5的倍數…


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<memory.h>

void test1()//試除法(1)
{
 //思路:每個數試除到√x
 const int Range = 100;
 int num = 0;
 int i = 0, j = 2;
 for (i = 2; i <= Range; i++)
 {
  //令每次試除都從2開始
  for (j = 2; j <= sqrt(i); j++)
  {
   if (0 == i%j)
    break;
  }
  if (j > sqrt(i))
  {
   printf("%2d ", i);
   num++;
   if (0 == num % 10)
    printf("\n");
  }
 }
 printf("\n");
}

void test2()//試除法(2)
{ 
 //思路:將所求出的素數保存起來,然後每次試除保存的這些素數
 const int Range = 100;
 const int num = (int)(Range / log(Range)*1.16); //素數定理(求一定範圍內的所有素數個數)
 int* str = (int*)calloc(num, sizeof(int));//開闢動態數組,保存以求素數
 //memset(str, 0, num*sizeof(int));//沒必要 系統開闢空間自動賦值0
 int i = 2, j = 0;
 str[0] = 2;
 for (i = 2; i < 100; i++)
 {
  for (j = 0; str[j] != 0 && i%str[j] != 0; j++)
  {
  }
  if (str[j] == 0)
   str[j] = i;
 }
 for (j = 0; str[j] < Range&&j < num; j++)
 {
  if (0 == j % 10)
   printf("\n");
  printf("%2d ", str[j]);
 }
 printf("\n");
 free(str);
}


void test3()//篩選法(size = 1B => size = 1bit)
{
 //思路:開闢動態數組初始爲0,從2開始一直到最大值,令滿足2的倍數條件的下標所對應置爲-1,輸出值爲0的下標
 const int Range = 100;
 int i = 0, j = 0;
 int num = 0;
 char* str = (char*)calloc(Range, sizeof(char));//開闢動態數組初始爲0
 str[0] = 1; str[1] = 1;
 for (i = 2; i <= Range; i++)
 {
  for (j = i + 1; j <= Range; j++)
  {
   if (0 == j % i && 0 == str[j])
    str[j] = 1;
  }
 }

 for (j = 0; j < Range; j++)
 {
  if (str[j] == 0)
  {
   if (0 == num++ % 10)
    printf("\n");
   printf("%2d ", j);
  }
 }
 printf("\n");
 free(str);
}


wKiom1a6zGKSQGv3AAD1o3cNyG4883.jpg



可查詢更多思路

http://blog.csdn.net/program_think/article/details/7032600/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章