生成 2 到 10,000 之间的数字。打印出来的数字只能是2个素数的倍数
Generate numbers from 2 to 10,000. The numbers printed can only be a multiple of 2 prime numbers
家庭作业:我简直被难住了。我设置了算法,但我不知道如何编写代码
需要说明的是,您不需要数组或通过引用传递变量。
该项目的目的是分解问题并使用 Top-Down_Design 或草稿本方法开发算法。
问题:
检查2到10000之间的数字,如果是Dual_Prime则输出。
我将 DualPrime 称为两个素数的乘积。 Ad 其中两个素数不相等。所以9不是对偶素数。 15 是 (3 * 5)。
输出每行有 10 个数字。
我的算法设置
第 1 步:查找质数。:
bool Prime_Number(int number)
{
for (int i = 2; i <= sqrt(number); i++)
{
if (number % 1 == 0)
return false;
}
return true;
}
第 2 步:将质数存储在数组中
第 3 步:将每个数组相互相乘
void Multiply_Prime_Numbers(int Array[], int Size)
{
for (int j = 0; j < Size- 1; j++)
{
Dual_Prime[] = Arr[j] * Arr[j + 1]
}
}
第 4 步:冒泡排序
void Bubble_Sort(int Array[], int Size) // Sends largest number to the right
{
for (int i = Size - 1; i > 0; i--)
for (int j = 0; j < i; j++)
if (Array[j] > Array[j + 1])
{
int Temp = Array[j + 1];
Array[j + 1] = Array[j];
Array[j] = Temp;
}
}
第 5 步:按 10 行显示新数组
void Print_Array(int Array[], int Size)
{
for (int i = 0; i < Size; i++)
{
cout << Dual_Prime[i] << (((j % 10) == 9) ? '\n' : '\t');
}
cout << endl;
}
I haven't learned dynamic arrays yet,
虽然动态数组和 Eratosthenes 筛法更可取,但我尝试编写最低限度 固定版本的代码。
首先,我们定义了以下全局变量,这些变量在您最初的 Multiply_Prime_Numbers
实现中使用。
(Please check this post.)
constexpr int DP_Size_Max = 10000;
int DP_Size = 0;
int Dual_Prime[DP_Size_Max];
接下来我们修复Prime_Number
如下。
原代码中条件number%1==0
不合适:
bool Prime_Number(int number)
{
if(number<=1){
return false;
}
for (int i = 2; i*i <= number; i++)
{
if (number % i == 0)
return false;
}
return true;
}
此外,Multiply_Prime_Numbers
应该用双for循环实现如下:
void Multiply_Prime_Numbers(int Array[], int Size)
{
for (int i = 0; i < Size; ++i)
{
for (int j = i+1; j < Size; ++j)
{
Dual_Prime[DP_Size] = Array[i]*Array[j];
if(Dual_Prime[DP_Size] >= DP_Size_Max){
return;
}
++DP_Size;
}
}
}
那么这些函数的作用如下。
Here's a DEMO of this minimally fixed version.
int main()
{
int prime_numbers[DP_Size_Max];
int size = 0;
for(int j=2; j<DP_Size_Max; ++j)
{
if(Prime_Number(j)){
prime_numbers[size]=j;
++size;
}
}
Multiply_Prime_Numbers(prime_numbers, size);
Bubble_Sort(Dual_Prime, DP_Size);
for(int i=0; i<DP_Size;++i){
std::cout << Dual_Prime[i] << (((i % 10) == 9) ? '\n' : '\t');;
}
std::cout << std::endl;
return 0;
}
Sieve of Eratosthenes 是一种已知的算法,可以加快搜索所有素数的速度,达到一定数量。
OP 可以使用它来实施其实施的第一步,但他们也可以对其进行调整以避免排序步骤。
给出所有素数的列表(最多要检查的最大数的一半):
创建一个与要检查的数字范围一样大的布尔数组。
使用两个嵌套循环将每对不同的质数相乘。
如果乘积小于10000(最大值)则将数组对应元素设置为true。否则跳出内循环。
完成后,遍历数组,如果值为真,则打印对应的索引。
这里有一个 proof of concept(在没有 OP 的分配限制的情况下实现)。
// Ex10_TwoPrimes.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void Homework_Header(string Title);
void Do_Exercise();
void Sieve_Of_Eratosthenes(int n);
void Generate_Semi_Prime();
bool Semi_Prime(int candidate);
bool prime[5000 + 1];
int main()
{
Do_Exercise();
cin.get();
return 0;
}
void Do_Exercise()
{
int n = 5000;
Sieve_Of_Eratosthenes(n);
cout << endl;
Generate_Semi_Prime();
}
void Sieve_Of_Eratosthenes(int n)
{
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
memset(prime, true, sizeof(prime));
for (int p = 2; p*p <= n; p++)
{
// If prime[p] is not changed, then it is a prime
if (prime[p] == true)
{
// Update all multiples of p
for (int i = p * 2; i <= n; i += p)
prime[i] = false;
}
}
}
bool Semi_Prime(int candidate)
{
for (int index = 2; index <= candidate / 2; index++)
{
if (prime[index])
{
if (candidate % index == 0)
{
int q = candidate / index;
if (prime[q] && q != index)
return true;
}
}
}
return false;
}
void Generate_Semi_Prime()
{
for (int i = 2; i <= 10000; i++)
if (Semi_Prime(i)) cout << i << "\t";
}
家庭作业:我简直被难住了。我设置了算法,但我不知道如何编写代码
需要说明的是,您不需要数组或通过引用传递变量。
该项目的目的是分解问题并使用 Top-Down_Design 或草稿本方法开发算法。
问题:
检查2到10000之间的数字,如果是Dual_Prime则输出。
我将 DualPrime 称为两个素数的乘积。 Ad 其中两个素数不相等。所以9不是对偶素数。 15 是 (3 * 5)。 输出每行有 10 个数字。
我的算法设置
第 1 步:查找质数。:
bool Prime_Number(int number)
{
for (int i = 2; i <= sqrt(number); i++)
{
if (number % 1 == 0)
return false;
}
return true;
}
第 2 步:将质数存储在数组中
第 3 步:将每个数组相互相乘
void Multiply_Prime_Numbers(int Array[], int Size)
{
for (int j = 0; j < Size- 1; j++)
{
Dual_Prime[] = Arr[j] * Arr[j + 1]
}
}
第 4 步:冒泡排序
void Bubble_Sort(int Array[], int Size) // Sends largest number to the right
{
for (int i = Size - 1; i > 0; i--)
for (int j = 0; j < i; j++)
if (Array[j] > Array[j + 1])
{
int Temp = Array[j + 1];
Array[j + 1] = Array[j];
Array[j] = Temp;
}
}
第 5 步:按 10 行显示新数组
void Print_Array(int Array[], int Size)
{
for (int i = 0; i < Size; i++)
{
cout << Dual_Prime[i] << (((j % 10) == 9) ? '\n' : '\t');
}
cout << endl;
}
I haven't learned dynamic arrays yet,
虽然动态数组和 Eratosthenes 筛法更可取,但我尝试编写最低限度 固定版本的代码。
首先,我们定义了以下全局变量,这些变量在您最初的 Multiply_Prime_Numbers
实现中使用。
(Please check this post.)
constexpr int DP_Size_Max = 10000;
int DP_Size = 0;
int Dual_Prime[DP_Size_Max];
接下来我们修复Prime_Number
如下。
原代码中条件number%1==0
不合适:
bool Prime_Number(int number)
{
if(number<=1){
return false;
}
for (int i = 2; i*i <= number; i++)
{
if (number % i == 0)
return false;
}
return true;
}
此外,Multiply_Prime_Numbers
应该用双for循环实现如下:
void Multiply_Prime_Numbers(int Array[], int Size)
{
for (int i = 0; i < Size; ++i)
{
for (int j = i+1; j < Size; ++j)
{
Dual_Prime[DP_Size] = Array[i]*Array[j];
if(Dual_Prime[DP_Size] >= DP_Size_Max){
return;
}
++DP_Size;
}
}
}
那么这些函数的作用如下。 Here's a DEMO of this minimally fixed version.
int main()
{
int prime_numbers[DP_Size_Max];
int size = 0;
for(int j=2; j<DP_Size_Max; ++j)
{
if(Prime_Number(j)){
prime_numbers[size]=j;
++size;
}
}
Multiply_Prime_Numbers(prime_numbers, size);
Bubble_Sort(Dual_Prime, DP_Size);
for(int i=0; i<DP_Size;++i){
std::cout << Dual_Prime[i] << (((i % 10) == 9) ? '\n' : '\t');;
}
std::cout << std::endl;
return 0;
}
Sieve of Eratosthenes 是一种已知的算法,可以加快搜索所有素数的速度,达到一定数量。
OP 可以使用它来实施其实施的第一步,但他们也可以对其进行调整以避免排序步骤。
给出所有素数的列表(最多要检查的最大数的一半):
创建一个与要检查的数字范围一样大的布尔数组。
使用两个嵌套循环将每对不同的质数相乘。
如果乘积小于10000(最大值)则将数组对应元素设置为true。否则跳出内循环。
完成后,遍历数组,如果值为真,则打印对应的索引。
这里有一个 proof of concept(在没有 OP 的分配限制的情况下实现)。
// Ex10_TwoPrimes.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void Homework_Header(string Title);
void Do_Exercise();
void Sieve_Of_Eratosthenes(int n);
void Generate_Semi_Prime();
bool Semi_Prime(int candidate);
bool prime[5000 + 1];
int main()
{
Do_Exercise();
cin.get();
return 0;
}
void Do_Exercise()
{
int n = 5000;
Sieve_Of_Eratosthenes(n);
cout << endl;
Generate_Semi_Prime();
}
void Sieve_Of_Eratosthenes(int n)
{
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
memset(prime, true, sizeof(prime));
for (int p = 2; p*p <= n; p++)
{
// If prime[p] is not changed, then it is a prime
if (prime[p] == true)
{
// Update all multiples of p
for (int i = p * 2; i <= n; i += p)
prime[i] = false;
}
}
}
bool Semi_Prime(int candidate)
{
for (int index = 2; index <= candidate / 2; index++)
{
if (prime[index])
{
if (candidate % index == 0)
{
int q = candidate / index;
if (prime[q] && q != index)
return true;
}
}
}
return false;
}
void Generate_Semi_Prime()
{
for (int i = 2; i <= 10000; i++)
if (Semi_Prime(i)) cout << i << "\t";
}