Перепечатка двумерного массива простых факторов

Я пишу параллельную простую программу факторизации на C ++. Мне удалось получить все нити и выяснить, как работает главное, но это тот самый конец, который я не могу получить. Когда пользователь вводит более одного числа, чтобы найти главный фактор, он печатает весь массив простой факторизации. Я хочу, чтобы он печатал только основные факторы, связанные с уникальным номером.

введите описание изображения здесь

Я хотел бы изменить его так, чтобы строка после «Первоначальная факторизация 10» не выводила весь вектор простых чисел. Вся печать происходит в нижней части основной функции. Чтобы быть очень конкретным, если бы я набрал две 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();

}

0

Решение

Это было слишком долго для комментария, поэтому я публикую это как ответ

Вы также можете попробовать это

#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]<<" ";
}
}
}

Что я делаю, так это то, что сначала я генерирую массив простых чисел, затем делю заданное число от элементов массива простых чисел. Если число делится на соответствующий простой фактор, то я отмечаю его индекс в массиве факторов как фактор, затем я перебираю массив факторов, если какой-либо элемент помечен как фактор, я печатаю его.

На самом деле, вы можете настроить количество элементов в массиве в соответствии с вашими требованиями.

1

Другие решения

Итак, я понял это:

#include <iostream>
#include <vector>
#include <chrono>
#include <thread>

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
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);
}

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);
numPrimes++;
}
}
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;
vector<long long> temp = ending[i];

for (int m = 0; m < temp.size(); m++)
{
cout << temp.at(m) << " ";
}
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();

}
0

По вопросам рекламы [email protected]