质数 - 我需要澄清代码实现
Prime numbers - I need clarification on code implementation
这是我知道的代码:
bool checkPrime(int n) {
bool prime = true;
for (int i = 2; i < n; i++) {
if ((n%i) == 0) {
prime = false;
}
}
return prime;
}
但是,如果您正在寻找素数,这样可以吗:
List<int> arr = [2, 3, 5, 7]; // Already known
int n = 30; // Between 1 to 30. It could be any number
for (int i = 2; i < n; i++) {
if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) {
arr.add(i);
}
// Then maybe some code for numbers less than 8
}
print(arr);
输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
而且时间复杂度也有很大差异吗?
您的代码不正确。
此代码之所以有效,是因为您将 n 的值设为 30,对于更大的数字(如 1000),这将产生不正确的结果。
列表 arr = [2,3,5,7]; // 已知
int n = 1000; // between 1 to 1000 it could be any number
List<int> arr = [2,3,5,7];
for (int i = 2; i < n; i++) {
if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0){
arr.add(i);
}
//Then maybe some code for numbers less than 8
}
print(arr);
当实际上只有 168 个质数时,您的代码将 return 231 个质数。
这是因为你没有考虑只能被7到那个数之间的一个质数整除的未来质数
例如:121 将被您 return 编辑为质数,但它是 11
的倍数
扩展你的模式。
虽然这会更快,因为它减少了一些除法运算,但由于有两个循环,它仍然是 N 平方。
这里我只是简单地从现有素数集合中除数,如果发现下一次迭代使用素数进行除法,则将它们添加到集合中。
List < int > arr = [2]; // taking 2 since this is the lowerst value we want to start with
int n = 30; // n can between 2 to any number
if (n < 3) {
print(arr); // can return from here.
}
// since we already have added 2 in the list we start with next number to check that is 3
for (int i = 3; i < n; i++) {
bool isPrime = true;
for (int j = 0; j < arr.length; j++) { // we iterate over the current prime number collection only [2] then [2,3]...
if (i % arr[j] == 0) { // check if number can be divided by exisiting numbers
isPrime = false;
}
}
if (isPrime) { // eg: 2 cant divide 3 so we 3 is also added
arr.add(i)
}
}
print(arr);
您可以在此处查看更快的模式。
Which is the fastest algorithm to find prime numbers?
这是我知道的代码:
bool checkPrime(int n) {
bool prime = true;
for (int i = 2; i < n; i++) {
if ((n%i) == 0) {
prime = false;
}
}
return prime;
}
但是,如果您正在寻找素数,这样可以吗:
List<int> arr = [2, 3, 5, 7]; // Already known
int n = 30; // Between 1 to 30. It could be any number
for (int i = 2; i < n; i++) {
if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) {
arr.add(i);
}
// Then maybe some code for numbers less than 8
}
print(arr);
输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
而且时间复杂度也有很大差异吗?
您的代码不正确。 此代码之所以有效,是因为您将 n 的值设为 30,对于更大的数字(如 1000),这将产生不正确的结果。 列表 arr = [2,3,5,7]; // 已知
int n = 1000; // between 1 to 1000 it could be any number
List<int> arr = [2,3,5,7];
for (int i = 2; i < n; i++) {
if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0){
arr.add(i);
}
//Then maybe some code for numbers less than 8
}
print(arr);
当实际上只有 168 个质数时,您的代码将 return 231 个质数。 这是因为你没有考虑只能被7到那个数之间的一个质数整除的未来质数
例如:121 将被您 return 编辑为质数,但它是 11
的倍数扩展你的模式。 虽然这会更快,因为它减少了一些除法运算,但由于有两个循环,它仍然是 N 平方。
这里我只是简单地从现有素数集合中除数,如果发现下一次迭代使用素数进行除法,则将它们添加到集合中。
List < int > arr = [2]; // taking 2 since this is the lowerst value we want to start with
int n = 30; // n can between 2 to any number
if (n < 3) {
print(arr); // can return from here.
}
// since we already have added 2 in the list we start with next number to check that is 3
for (int i = 3; i < n; i++) {
bool isPrime = true;
for (int j = 0; j < arr.length; j++) { // we iterate over the current prime number collection only [2] then [2,3]...
if (i % arr[j] == 0) { // check if number can be divided by exisiting numbers
isPrime = false;
}
}
if (isPrime) { // eg: 2 cant divide 3 so we 3 is also added
arr.add(i)
}
}
print(arr);
您可以在此处查看更快的模式。 Which is the fastest algorithm to find prime numbers?