打印100到200间的所有素数。
素数:除了1和本身没有其它的因数的数称为素数。
方法: 试除法
写法一:
【思想】:用flag作为标志位,标记是否为素数。 flag 置为1,即为不是素数。 flag为0, 则是素数。 在外层for循环中判断是否打印,count计数位是否++。
【代码体现】:
int main()
{
int count = 0; // 计算素数的个数
int flag = 0; // 标志位,标记是否为素数
for (int i = 100; i <= 200; i++)
{
flag = 0;
for (int j = i - 1; j >= 2; j--)
{
if (i%j == 0)
{
flag = 1; // 将flag置为1,标识不是素数
break;
}
}
if (!flag) // 如果flag 为0标识为素数, !flag即为非0,则count++
{
count++;
printf("%d ", i);
}
}
printf("\n总共有%d个素数\n", count);
system("pause");
}
写法二:
【思想】:在1-i-1的for循环后,通过j的值判断是i否为素数, 代码注释中有详细说明
【代码体现】:
int main()
{
int count = 0;
for (int i = 100; i <= 200; i++)
{
// 判断i是否为素数
// 检查 2-i-1个数是否是i的因子
int j = 0;
for (j = 2; j <= i - 1; j++)
{
if (i%j == 0)
break;
}
// 在此处跳出循环的有从2-i-1检测完的,也有不符合要求break,跳出循环来到这一步的。
// 如果j > i-1;说明从2到i-1的数全部都检测了一遍,没有i的因数
if (j > i - 1)
{
count++;
printf("%d ", i);
}
}
printf("\n总共有%d个素数\n", count);
system("pause");
}
还可以优化
【思想】:计算是否为i的因数时,只需要计算到根号下i,就可以。因为一个数 x 等于 x 开根号后的平方,也就是如果两个数的乘积等于x,那么这两个数肯定有一个小于 x的开根号, 而另一个大于 x的开根号。 比如64,88 = 64, 还有 232 = 64,2比8小,32比8大 ; 还有 4*16=64,4比8小,16比8大。 所以计算到比sqrt(x)小的数就可以了。
【代码体现】:
#incldue <math.h>
int main()
{
int count = 0;
for (int i = 100; i <= 200; i++)
{
// 判断i是否为素数
// 2 - i-1
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i%j == 0)
break;
}
//
if (j > sqrt(i))
{
count++;
printf("%d ", i);
}
}
printf("\n总共有%d个素数\n", count);
system("pause");
}
当然,还可以继续优化
【思想】: 因为素数,不可能是偶数。所以在最外层循环中,将 for(int i = 100; i <= 200; i++) 换成 for(int i = 101; i <= 200; i+=2) 。这样循环的次数能减少一半。大大的提高了计算的效率。
【代码体现】:
int main()
{
int count = 0;
for (int i = 101; i <= 200; i+= 2)
{
// 判断i是否为素数
// 2 - i-1
int j = 0;
for (j = 2; j <= i/2; j++)
{
if (i%j == 0)
break;
}
//
if (j > i/2)
{
count++;
printf("%d ", i);
}
}
printf("\n总共有%d个素数\n", count);
system("pause");
}