方法一:遍历法
对2到输入的数值n之间的所有整数进行循环遍历(由于1不是素数,故从2开始遍历)在内循环判断该循环整数是否为素数,判断条件是该整数能否被2和该整数减1之间的数整除,在一层循环内二层循环外设置flag变量为1,若在判断中满足条件,flag置0,跳出二层循环后判断flag是否仍为1,若是,说明该整数不能被整除,为素数,输出值,反之无法被输出。
最后用clock函数计算运行时间
算法时间复杂度:O(n^2)
(另外这个算法可以做优化,将第二层循环的终止条件改为i/2或者sqrt(i),减少循环次数提高效率)
//方法一:
int main()
{
int n;
cout << "请输入N:";
cin >> n;
clock_t t1, t2;
t1 = clock();
for (int i = n-1; i >1; i--)
{
//判断是否为素数
int flag = 1;
for (int j = 2; j < i ;j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)//或者if(i==j)
cout << i << " ";
}
t2 = clock();
cout << endl<<"运行时间是:"<<((double)(t2 - t1)) / CLK_TCK <<"秒" << endl;
return 0;
}
方法二:排除法
创建一个变长数组,将2到输入的数字N全部输入到数组内,并从2到N遍历,从2开始数字的整数倍都置0,直到超过N循环结束,遍历结束后输出不为0的数组值,即为小于N的所有素数,并计算运行时间。
算法时间复杂度:O(n^2),实际上是O(n^2/+n)
//方法二:
int main()
{
int N;
cout << "请输入N:";
cin >> N;
clock_t t1, t2;
t1 = clock();
int arr[N];
for (int i = 2; i < N; i++)
{
arr[i] = i;
}
for (int i = 2; i < N; i++)
{
if (arr[i] != 0)
{
for (int j = 2 * i; j < N; j += i)
{
arr[j] = 0;
}
}
}
for (int i = 1; i < N; i++)
{
if(arr[i])
cout << arr[i] << " ";
}
t2 = clock();
cout << endl << "运行时间是:" << ((double)(t2 - t1)) / CLK_TCK << "秒" << endl;
return 0;
}
方法三:优化法
和方法一类似,但做了很多优化,由于除了2之外的所有素数都是奇数,因此在第一层循环中可以遍历奇数,并且所有数因式分解成任何两项相乘的形式,总有一项小于等于该数取平方根的数,因此只要排查3到该数取平方根的数范围即可判断是否为素数。并计算运行时间。
算法时间复杂度:O(n*√n)
//方法三:
int main()
{
int n;
cout << "请输入N:";
cin >> n;
clock_t t1, t2;
t1 = clock();
cout << "2 ";//2本身就是素数,且是所有素数中唯一的偶数
for (int i = 3; i < n; i += 2)
{
int flag = 1;
for (int j = 2; j * j <=i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)//或者if(j * j >i)
{
cout << i << " ";
}
}
t2 = clock();
cout << endl << "运行时间是:" << ((double)(t2 - t1)) / CLK_TCK << "秒" << endl;
return 0;
}