素数求解是一个很经典的问题,今天想和大家唠唠,它被求解时的魅力
(拿求100 - 200之间素数为例)
难受
暴力试除法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int is_prime(int i)
{
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
return 0;
}
return 1;
}
//试除法
void fun1()
{
int i = 0;
for (i = 100; i <= 200; i ++)
{
if (is_prime(i) == 1)
{
printf("%d ", i);
}
}
}
有点意思
略去偶数,步子变大
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int is_prime(int i)
{
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
return 0;
}
return 1;
}
//试除法
void fun1()
{
int i = 0;
for (i = 100; i <= 200; i +=2) //变成i = i + 2
{
if (is_prime(i) == 1)
{
printf("%d ", i);
}
}
}
开心
试除到自身的开平方
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <cmath>
int is_prime(int i)
{
int j = 0;
for (j = 2; j < sqrt(i); j++)
{
if (i % j == 0)
return 0;
}
return 1;
}
//试除法
void fun1()
{
int i = 0;
for (i = 101; i <= 200; i += 2) //两处优化:1.sqrt()开平方 2.在筛选的时候直接去掉偶数
{
if (is_prime(i) == 1)
{
printf("%d ", i);
}
}
}
惊奇,不一样的天地,还有这样的方法
筛选法
(讲一个数从整除1,整除2…一直整除到自身-1为止,一步步筛选)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int arr[100];
int j = 0;
for (i = 0; i < 100; i++) //0 - 100 (100个数)是整个要查找数组的宽度(即要找素数的范围)
{
arr[i] = i + 100; //将100-200的数字放到数组中
}
for (i = 0; i < 100; i++)
{
j = i - 1; //从至少比自己小1的数字开始筛选
while (j > 1)
{
if (0 == arr[i] % j)//将能够被整除的数字置零
arr[i] = 0;
j -= 1;
}
}
for (i = 0; i < 100; i++)
{
if (arr[i] != 0)
printf("%d ", arr[i]);//如果数字没有被置零,则说明该数字为素数,并将其输出
}
return 0;
}
啦啦啦,是不是觉得很interesting!!!