求解整数n之内的所有质素(素数)
自己做的小练习, 那种时间效率为(n*n)的方式, 就忽略了
什么是质素(素数)?
1. 只能被1和他本身整除的自然数(另外一种描述: 质素是不能被2到比他自身小1的任何正整数整除的自然数,1既不是质数也不是合数), 如 3,5,7;
2. 所有的质素都是奇数(偶数都可以被2整除), 2除外, 2是最小的质数
3. 所有的非质素都可以分解为多个质素的乘积. 如: 非质素56:56 = 8*7 = 2*4*7 = 2*2*2*7
求解整数n之内的所有质素(素数).
1. 构造外层循环得到1-n之间的数i, 为减小循环次数, 可以跳过所有的偶数
2. 构造内层循环得到2-m之间的数j, m=n的平方根取整(或者采用j*j<n做判断条件可以规避平方根不是整数的问题);
{判断当i不等于j时, i是否能被j整除, 若能整除则不是素数则修改标记为并结束内层循环}
3. 内循环结束后判断j是否大于m, 若是则i为素数并打印输出, 否则继续执行外层循环(或者内循环结束后判断标志位是否为true, 若是true则为素数, 否则继续循环).
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class PrimeNum
{
static void Main(string[] args)
{
Console.Write("请输入要求解的质数范围2-n: ");
int n = Convert.ToInt32(Console.ReadLine().Trim());//忽略验证
Console.Write("2 ");//输出最小的质数
bool isprime;//是否质数的标志
//最外层循环, 跳过偶数
for (int i = 3; i <= n; i += 2)
{
isprime = true;//每次重置标志位
for (int j = 3; j * j <= n; j += 2)//内层循环, 判断i是否是质素, 跳过偶数
{
if (i % j == 0 && i != j)
{
isprime = false;
break;
}
else
{
//nothing to do here!
}
}
if (isprime)
{
Console.Write(i.ToString() + " ");
}
}
}
}