小白写素数时的突发奇想
由于学过c++但掌握并不是很牢固,导致一些基本语法,如对bool的运用不是很清楚。在作业里有一道判断素数的编程题,是我之前学习c++时也遇到过的,在今天的学习和编程过程中,我想到了对过去一些掌握不牢靠知识的应用。
#include<iostream>
#include<cmath>
using namespace std;
int main() {//判断100-200间的素数
int arr[50][2] = { 0 }; int i = 0;//在这里创建了一个50×2的二维数组
//数组长为50,因为可以确定的是,所有偶数均不可能是素数,直接减少一半的数据
for (i=0; i <= 49; i++) {
arr[i][0] = 101+2*i;//这里,将101-199的所有奇数填入数组第一行
}
for(i=0;i<=49;i++){
for (int Sqrt = 2; Sqrt < sqrt(arr[i][0]); Sqrt++)
/*两个数相乘时,若两数均取最大,则只能均为平方根。
因此,若一个数大于平方根,另一个数必定在之前被判断过了。所以取平方根为上限就足够了。*/
{
if (arr[i][0] % Sqrt == 0) arr[i][1] = 1;
//若在循环过程中,发现某两数可整除,说明预判断数为合数。用1表示合数。
}
}
for (i = 0; i <= 49; i++) {
if(arr[i][1]!=1)cout << arr[i][0] << " ";
//数组第二行作为判断器使用,若第二行填的不是1,那么第一行对应位置的一定是素数,故输出之
}
}
没有注释的版本如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main() {
int arr[50][2] = { 0 }; int i = 0;
for (i=0; i <= 49; i++) {
arr[i][0] = 101+2*i;
}
for(i=0;i<=49;i++){
for (int Sqrt = 2; Sqrt < sqrt(arr[i][0]); Sqrt++) {
if (arr[i][0] % Sqrt == 0) arr[i][1] = 1;
}
}
for (i = 0; i <= 49; i++) {
if(arr[i][1]!=1)cout << arr[i][0] << " ";
}
}
这里我用了二维数组,并根据老师的指导简化了循环次数,降低了循环条件,增加了运算效率。至于为什么用二维数组做指示器,我的回答是我不会用bool之类的做判断(悲)