当前位置: 代码迷 >> 综合 >> 给定N个随机正整数,将其中为质数的整数输出
  详细解决方案

给定N个随机正整数,将其中为质数的整数输出

热度:19   发布时间:2024-02-26 12:36:33.0

给定N个随机正整数,将其中为素数的整数输出。
例如:
输入:[1, 2, 3, 5, 11, 12]
输出:[2, 3, 5,11]
注意:
1、输出数组剩余元素先后顺序需要与原数组保持一致。
2、给出数组无需去重。

 

以下是我写的代码,跑了几遍,没发现BUG。


#include <iostream>
#include <stdlib.h>
#include <time.h>using namespace std;int g_nMaxNum = 100;  // 最大数值
int g_nNumCount = 200;  // 数字数量// 输出数组
void PrintArr(int* pNum, int nCount)
{for (int nIndex = 0; nIndex < nCount; ++nIndex){if (0 != pNum[nIndex]){cout << pNum[nIndex] << "  ";}}cout << endl;
}// 获取随机的数组
void GetRandArr(int* pNum, int nCount)
{for (int nIndex = 0; nIndex < nCount; ++nIndex){pNum[nIndex] = rand() % g_nMaxNum;}
}// 筛选质数
void SelectPrimeNum(int* pNum, int nCount)
{int nMaxRemainNum = 0;  // 剩下数值里最大的值int nComNumCount = 0;       // 找到的合数数量// 先把1和偶数去除,并获取剩下数值里最大的值int nIndex = 0;int nOneCount = 0;  // 1的个数for (; nIndex < nCount; ++nIndex){if (pNum[nIndex] == 0)  // 数值为0的跳过{continue;}if (pNum[nIndex] == 1)  // 去除1{pNum[nIndex] = 0;++nOneCount;continue;}if (pNum[nIndex] % 2 == 0 && pNum[nIndex] != 2)  // 能被2整除{pNum[nIndex] = 0;++nComNumCount;continue;}// 获取剩余数值中最大的值if (pNum[nIndex] > nMaxRemainNum){nMaxRemainNum = pNum[nIndex];}}// 输出第一轮筛选后的结果cout << endl << "第1轮,除数为2,剩余最大数值为" << nMaxRemainNum << ",找到的合数数量 : " << nComNumCount << ", 1的个数 : " << nOneCount << endl;PrintArr(pNum, g_nNumCount);// 把 “2 * n + 3” 的倍数去除,循环到 “剩下数值里最大的值”int nRound = 2;for (int nDivisor = 3; nDivisor <= nMaxRemainNum; nDivisor += 2, ++nRound){int nCurrMaxRemainNum = 0;  // 当前除数中,剩下数值里最大的值nComNumCount = 0;for (nIndex = 0; nIndex < nCount; ++nIndex){if (pNum[nIndex] == 0)  // 数值为0的跳过{continue;}if (pNum[nIndex] % nDivisor == 0 && pNum[nIndex] != nDivisor)  // 能被 “2 * n + 3” 整除{pNum[nIndex] = 0;++nComNumCount;continue;}// 获取剩余数值中最大的值if (pNum[nIndex] > nCurrMaxRemainNum){nCurrMaxRemainNum = pNum[nIndex];}}// 剩余最大数值是否变小if (nCurrMaxRemainNum < nMaxRemainNum){nMaxRemainNum = nCurrMaxRemainNum;}// 输出第n轮筛选后的结果cout << endl << "第" << nRound << "轮,除数为" << nDivisor << ",剩余最大数值为" << nMaxRemainNum << ",找到的合数数量 : " << nComNumCount << endl;PrintArr(pNum, g_nNumCount);// 如果找到的合数数量为0,说明已经找完if (0 == nComNumCount){break;}}
}int main()
{srand(time(0));int* pNum = new int[g_nNumCount];GetRandArr(pNum, g_nNumCount);cout << "原始随机数据 :" << endl;PrintArr(pNum, g_nNumCount);SelectPrimeNum(pNum, g_nNumCount);cout << endl << "最终结果 :" << endl;PrintArr(pNum, g_nNumCount);delete[] pNum;pNum = nullptr;std::cout << "Hello World!\n";
}

 

  相关解决方案