2014-09-29 27 views
-1

我得到了后面的任务。在一个单独的线程中查找素数

编写一个输出素数的多线程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

请解释一下你的程序在做什么(和/或不是做什么),它与应该做的不同。并评论你的代码! – 2014-09-29 00:17:10

+1

我首先编写一个单线程程序,然后*处理使用线程使其更快。 – 2014-09-29 00:40:59

+0

您的程序声称素数是一个不能被2,3,4,5,6,7,8或9整除的数字。这不完全是素数的定义。例如,2,3,5和7是素数。 – molbdnilo 2014-09-29 00:44:54

回答

1

因为你检查整除由2和9之间的所有整数,你的程序将不会报告在寻找所有使用小于11而i仅在循环印刷目的使用,并没有任何质数素数。

+0

准确地说,该程序还将报告为一个首要的任何由大于7的素数制成的复合数。例如:17 * 13。甚至11^2。 – luk32 2014-09-29 01:19:34

0

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

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