您的位置:首页 > 编程语言 > C语言/C++

C/C++,笔试面试,多种方法求100以内的所有素数

2016-02-10 13:43 417 查看
使用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);
}






可查询更多思路 http://blog.csdn.net/program_think/article/details/7032600/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  素数 笔试面试