c++ - 重印二维数组素因子

标签 c++ multithreading concurrency prime-factoring

我正在用 C++ 编写并行素数分解程序。我设法获得了所有的线程并很好地找到了素数,但它似乎是我无法得到的终点。当用户输入多个数以求质因数时,它会打印整个质因数分解数组。我希望它只打印与唯一数字相关的主要因素。

enter image description here

我想将其更改为“The prime factorization of 10 is”之后的行不打印素数的整个 vector 。所有的打印都发生在 main 函数的底部。非常具体,如果我输入两个 10,输出应该是:

---期望的输出---

“10的质因数分解是”

“2 5”

“10的质因数分解是”

“2 5”

---/期望的输出---

不要担心“有:0 个素数”部分。我已经知道如何解决这个问题了

感谢任何帮助!

#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
#include <mutex>
#include <list>
#include <algorithm>

using namespace std;
using namespace std::chrono;

int userInput;                    // This number is used to help store the user input
vector<long long> vec(0);         // A vector storing all of the information
int numPrimes;                    // Used to count how many prime numbers there are
bool PRINT = false;               // lets me decide if I want to print everything for debugging purposes
int arraySize;
vector<thread> threads;
vector<vector<long long> > ending;

void getUserInput()
{
    //while the user has not entered 0, collect the numbers.
    cout << "Please enter a number for prime factorization. Enter 0 to quit" << endl;

    do
    {
        cin >> userInput;

        if (userInput != 0)
        {
            vec.push_back(userInput);
            arraySize++;
        }

    } while (userInput != 0);
}

vector<long long> primeFactors(long long n)
{
    vector<long long> temp;
    while (n % 2 == 0)
    {
        temp.push_back(n);
        numPrimes++;
        n = n / 2;
    }

    for (int i = 3; i <= sqrt(n); i = i + 2)
    {
        while (n%i == 0)
        {
            temp.push_back(n);
            numPrimes++;
            n = n / i;
        }
    }

    if (n > 2)
    {
        temp.push_back(n);
        numPrimes++;
    }

    return temp;
}

void format()
{
    cout << endl;
}

bool isPrime(long long number){

    if (number < 2) return false;
    if (number == 2) return true;
    if (number % 2 == 0) return false;
    for (int i = 3; (i*i) <= number; i += 2){
        if (number % i == 0) return false;
    }
    return true;

}

vector<long long> GetPrimeFactors(long long num)
{
    vector<long long> v;
    for (int i = 2; i <= num; i++)
    {
        while (num % i == 0)
        {
            num /= i;
            v.push_back(i);
        }
    }
    return v;
}

int main()
{
    // how to find out how many cores are available.
    getUserInput();

    high_resolution_clock::time_point t1 = high_resolution_clock::now();

    // vector container stores threads

    format();

    for (int i = 0; i < arraySize; ++i)
    {
        vector<long long> temp;

        threads.push_back(thread([&] 
        { 
            ending.push_back(GetPrimeFactors(vec.at(i)));
        }));
    }

    // allow all of the threads to join
    for (auto& th : threads)
    {
        th.join();
    }

    for (int i = 0; i < arraySize; ++i)
    {
        cout << "The prime factorization of " << vec.at(i) << " is \n" << endl;
        for (int m = 0; m < ending.size(); m++)
        {
            vector<long long> v = ending[m];
            for (int k = 0; k < v.size(); k++)
            {
                cout << v.at(k) << " ";

            }

        }
        cout << endl;
    }



    format();

    cout << "There are: " << numPrimes << " prime numbers" << endl;

    //time
    high_resolution_clock::time_point t2 = high_resolution_clock::now();
    auto duration = duration_cast<microseconds>(t2 - t1).count();

    format();

    cout << "Time in seconds: " << (duration / 1000000.0) << endl;

    format();

}

最佳答案

这篇评论太长了,所以我将其作为答案发布

你也可以试试这个

#include <iostream>

using namespace std;

long long Number;
int Prime[10000];

void Gen()
{
    Prime[0]=2;
    Prime[1]=3;
    bool IsPrime;
    long long Counter=2;
    for( int ii=4 ; Counter<10000 ; ii++ )
    {
        IsPrime=true;
        for( int jj=0 ; Prime[jj]<=sqrt(ii) ; jj++ )
        {
            if(ii%Prime[jj]==0)
            {
                IsPrime=false;
                break;
            }
        }
        if(IsPrime)
        {
            Prime[Counter]=ii;
            Counter++;
        }
    }
}
int main()
{
    int Factor[10000]={0};
    Gen();
    cout<<"Enter Number"<<endl;
    cin>>Number;
    Factorize :
    for( int ii=0 ; ii<10000 ; ii++ )
    {
        if(Number<Prime[ii])
        {
            break;
        }
        if(Number%Prime[ii]==0)
        {
            Number/=Prime[ii];
            Factor[ii]=1;
            if(Number==1)
            {
                break;
            }
            goto Factorize;         
        }
    }
    for( int ii=0 ; ii<10000 ; ii++ )
    {
        if(Factor[ii])
        {
            cout<<Prime[ii]<<" ";
        }
    }
}

好吧,我正在做的是首先生成质数数组,然后我将给定的 Number 从 Prime 数组的元素中除以。如果 Number 可以被相应的素因子整除,那么我将其在因子数组中的索引标记为一个因子,然后我将遍历因子数组,如果任何元素被标记为因子,那么我将打印它。

实际上,您可以根据需要调整数组中元素的数量。

关于c++ - 重印二维数组素因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26172321/

相关文章:

c++ - 错误 : passing 'const string' as this argument of push_back

java - Java JVM中的指令重新排序

Java-并发和交错

multithreading - 交换的替代版本!还返回换出的值(value)

ruby - 遍历 ruby​​ Hash 时并发修改

c++ - 函数的调用者如何知道是否使用了返回值优化?

c++ - 头文件类成员函数声明错误: "incomplete type ' ' name in nested name specifier"

c++ - 将纹理传递给网格对象的 D3D9 效果

android - 如何停止后台线程, `interupt` 不工作

python - 在某些情况下,Python 线程可以安全地操作共享状态吗?