在单独的线程中查找素数

Find prime numbers in a separate thread

本文关键字:查找 线程 单独      更新时间:2023-10-16

下面给了我一个任务。

编写一个输出素数的多线程Java、Pthreads或Win32程序。这程序应按以下方式工作:

  1. 用户将运行程序,并在命令行上输入一个数字
  2. 然后,程序将创建一个单独的线程,输出所有素数小于或等于用户输入的数字

#include <windows.h>
#include <iostream>
#define MAX_THREADS 1
using namespace std;
DWORD WINAPI Prime (LPVOID);
HANDLE hThreads [MAX_THREADS];
DWORD id [MAX_THREADS];
DWORD waiter;
DWORD WINAPI Prime(LPVOID Param)
{
    DWORD Number = *(DWORD*)Param;
    for (DWORD i=0;i<=Number;i++)
    {
        if((Number%2==0) ||(Number%3==0) || (Number%4==0)||(Number%5==0)||(Number%6==0)||  (Number%7==0)||(Number%8==0)||(Number%9==0))
        cout <<"";
        else
        cout<<i;
    }
    return 0;
}
int main(int argc, char* argv[ ])
{
    DWORD ThreadId;
    HANDLE ThreadHandle;
    int Param;
    cout<<"Enter a number:";
    cin>>Param;
    cout<<"Prime numbers less than and equal to your number";
    ThreadHandle=CreateThread(NULL,0,Prime,&Param,0,&ThreadId);
    waiter=WaitForMultipleObjects(MAX_THREADS,hThreads,TRUE,INFINITE);
    for(int i=0;i<MAX_THREADS;i++)
        CloseHandle(hThreads[i]);
    system ("pause");
    return 0;
}

我一直在用我在课堂上学到的东西来编写这个程序,但我似乎无法让我的程序发挥作用。如果有人能帮助我清理我的程序并帮助我使其发挥作用,我将不胜感激。

因为您检查所有2到9之间的整数的可除性,所以您的程序不会报告任何小于11的素数。i只用于循环中的打印目的,而根本不用于寻找素数。

您检查素数的方法是错误的!我添加了一个检查素数的功能

    #include <windows.h>
    #include <iostream>
    #define MAX_THREADS 1
    using namespace std;
    DWORD WINAPI Prime (LPVOID);
    HANDLE hThreads [MAX_THREADS];
    DWORD id [MAX_THREADS];
    DWORD waiter;
    int check_prime(int a)
    {
       int c;
       for ( c = 2 ; c <= a - 1 ; c++ )
       { 
          if ( a%c == 0 )
            return 0;
       }
       if ( c == a )
          return 1;
    }
    DWORD WINAPI Prime(LPVOID Param)
    {
        DWORD Number = *(DWORD*)Param;
        for (DWORD i=2;i<=Number;i++)
        {
            if(check_prime(i)==0)
                cout <<"";
            else
                cout<<i;
        }
        return 0;
    }
    int main(int argc, char* argv[ ])
    {
        // same your code
        return 0;
    }