- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一段代码来打印用户写的从头到尾的所有数字。我想用线程来做到这一点。例如,开始是 1,结束是 100。我要求用户输入一个 N 数,它是程序创建的线程数。比如他输入10,程序就会创建10个线程。第一个线程将打印从 1 到 10 的质数。第二个线程将打印从 10 到 20 的质数。第三个从 20 到 30 等等。
但是我有一个问题。事实上,我的程序在文件中打印了很多不是质数的数字,而且我在代码中多次打印了相同的数字。
这是我的代码:
void writePrimesToFile(int begin, int end, ofstream& file)
{
for (int i = begin; i <= end; i++)
{
for (int j = begin; j < end / 2; j++)
{
if (i % j != 0)
{
file << i << endl;
}
}
}
}
void callWritePrimesMultipleThreads(int begin, int end, string filePath, int N)
{
ofstream myfile(filePath);
clock_t startTimer, stopTimer;
startTimer = clock();
vector<thread> arr;
for (int i = 0; i < N; i++)
{
int start = begin;
int finish = N;
arr.emplace_back(writePrimesToFile, start, finish, ref(myfile));
start = finish;
finish += N;
}
for (auto& thread : arr)
{
thread.join();
}
stopTimer = clock();
cout << "The time that takes is: " << (double)(stopTimer - startTimer) / CLOCKS_PER_SEC << endl;
}
主要代码:
callWritePrimesMultipleThreads(1, 100, "primes2.txt", 10);
最佳答案
代码中有很多问题需要修复,素数将从 1 开始,而不是 0,而且你应该开始除以 2 而不是 1 或 0(你不能除以 0),在你得到其余的 0 之后一,它不是素数,它总是以你要计算的数结束(10 % 20 是无意义的)
#include <stdio.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <functional>
#include <fstream>
#include <math.h>
using namespace std;
mutex mtx;
void writePrimesToFile(unsigned int begin, unsigned int end, ofstream& f)
{
for (unsigned int i = begin; i <= end; i++)
{
for (unsigned int j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
else if(j + 1 == i)
{
mtx.lock();
f << i << endl;
mtx.unlock();
}
}
}
}
void callWritePrimesMultipleThreads(unsigned int begin, unsigned int end, string filePath, unsigned int N)
{
ofstream myfile(filePath);
clock_t startTimer, stopTimer;
startTimer = clock();
vector<thread> arr;
unsigned int each = end/N;
unsigned int start = begin;
unsigned int finish = start + each - 1;
for (unsigned int i = 0; i < N; i++)
{
arr.emplace_back(writePrimesToFile, start, finish, ref(myfile));
start += each;
finish += each;
}
for (auto& thread : arr)
{
thread.join();
}
stopTimer = clock();
cout << "The time that takes is: " << (double)(stopTimer - startTimer) / CLOCKS_PER_SEC << endl;
}
int main()
{
callWritePrimesMultipleThreads(1, 110, (string)"primes.txt", 10);
return 0;
}
此外,在写入文件时添加了一个互斥量。
关于c++ - 带线程的质数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40287406/
我知道这不是寻找素数的最佳方法,也不是最有效的方法;但是,我似乎无法找到 169 算作素数的原因(就我而言,对于较小的数字,它可以正常工作)。 public static int checkPrime
有人可以指导我获取素数吗?这是家庭作业,所以我不想要答案,但一些指示将不胜感激。这真的让我很烦:( 我想我很接近。但是我遇到的问题是数字 25 和 35。它们不是质数,但是这个函数正在返回它们 var
利用正则判别素数,来源于网络,神人! 复制代码 代码如下: Set regex = New RegExp regex.Pattern = "^1?$&b
质数又称素数。一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数;否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑
我在 Ruby on Rails 中尝试如何找到质数。这是我的代码: 助手:app/helpers/test_helper.rb module TestHelper
lower = int(input("from:")) upper = int(input("to:")) for num in range(lower,upper + 1): if num >
最近我对 LINQ 很感兴趣。我正在尝试获取质数。我实际上做得很好,但我的代码没有显示低于 Sqrt(n) 的素数。 static void Main(string[] args) {
在尝试设计算法时,我偶然发现了这个问题。这不是家庭作业。 令 P_i = 前 i 个素数的数组。现在我需要最小的 i 这样 Sum 1 / (P_i[n]*P_i[n]) >= 1. (如果这样的
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,
我是新来的。我正在尝试解决此练习 Problem 18只是为了加强我的解决能力。我已经编码了答案。该任务要求“在 1,000,000 以下的质数中,有多少个数位之和等于两周中的天数?” (两周是 14
我是一名优秀的程序员,十分优秀!