对于一个问题的解决,我们通常都是去寻找它的最优解,写出一个解决方法,还要去不断优化,让程序的执行效率更高
对于求解素数,我们可以有很多方法来解决
1.直接在这个数的范围内用所有数进行试除(效率比较低)
#include<stdio.h>
int main()
{
int i;
int j;
int count = 0;
for (i = 2; i <= 100; i++)
{
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0) //试除法
{
break;
}
}
if (j == i) //在j==i时,说明根本就没找到一个数能整除i,所以它就是素数
{
printf("%d ", i);
count++;
}
}
printf("\n%d", count); //输出素数的个数
}
2.对上一步代码继续优化(用2到i的开方之间的数来进行试除)
#include<stdio.h>
#include<math.h>
int main()
{
int i;
int j;
int count = 0;
int r;
for (i = 2; i <= 100; i++)
{
r = sqrt(i); //通过2到i的开方之间的数来确定是否为素数
for (j = 2; j <= r; j++)
{
if (i % j == 0)
{
break;
}
}
if (j > r)
{
printf("%d ", i);
count++;
}
}
printf("\n%d", count);
return 0;
}
3.也可以用2到i/2来试除
#include<stdio.h>
int main()
{
int i;
int j;
int count = 0;
for (i = 2; i <= 100; i++)
{
for (j = 2; j <= i/2; j++)
{
if (i % j == 0)
{
break;
}
}
if (j > i/2)
{
printf("%d ", i);
count++;
}
}
printf("\n%d", count);
return 0;
}
4.再优化(因为素数不可能为偶数,所以可以在试除的数中直接将偶数排除)
#include<stdio.h>
int main()
{
int i;
int j;
int count = 0;
for (i = 1; i <= 100; i+=2) //通过i+=2让每次试除的数都是奇数
{
for (j = 2; j <= i/2; j++)
{
if (i % j == 0)
{
break;
}
}
if (j > i/2)
{
printf("%d ", i);
count++;
}
}
printf("\n%d", count);
return 0;
}
5.筛选法,通过第三步优化把偶数排除,再试除,那么我们进而发现不仅可以排除2的倍数,也可以通过筛选,将每个数的倍数都给它排除掉
#include<stdio.h>
int main()
{
int i;
int j;
int count = 0;
int arr[100];
for (i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
for (i = 0; i < 100; i++)
{
for (j = i - 1; j > 1; j--) //通过j=i-1直接跳过0,1
{
if (arr[i] % j == 0)
{
arr[i] = 0;
}
}
}
for (i = 1; i < 100; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
count++;
}
}
printf("\n%d", count);
return 0;
}
运行结果