实现多线程程序测试一个数是否是完全数
实现一个多线程程序测试一个数是否是完全数。如果一个数N的所有因数(不包括N本身)的和还是N,则N是一个完全数,如6和28,输入是一个整数N,如果N是完全数则输出true,否则输出false。主程序从命令行读取数字N和P,创建P个线程,将1~N这N个数分给各个线程,保证两个线程不会分到相同的数。每个线程判断这些树是不是N的因数,如果是,那么放到一个共享的缓冲区中。在父进程中用合适的同步方法等待所有的线程执行完毕后,判断N是否是完全数,即判断是否N的所有因数之和还是N(提示:你可以将测试的数限定在1至N的平方根来加速计算过程。)
#include <stdio.h>
#include<pthread.h>
int a[100]={0};
int j=0;
int n;
int x=0;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
void* judge(void *arg)
{
pthread_mutex_lock(&mutex);
x++;
printf("%d个线程 ",x);
if(n%x==0)
{
a[j]=x;
j++;
printf("%d是因数",x);
}
printf("\n");
pthread_mutex_unlock(&mutex);
return 0;
}
int main(){
int i;
printf("输入N\n");
scanf("%d",&n);
pthread_t th;
for(int i=0;i<n-1;i++)
{
pthread_create(&th, NULL,judge,NULL);
}
pthread_join(th,NULL);
int sum=0;
printf("因数有:");
for(i=0;a[i]!=0;i++)
{
sum=sum+a[i];
printf("%d ",a[i]);
}
printf("\n");
printf("sum=%d\n",sum);
if(sum==n)
printf("%d是完全数",n);
else
printf("%d不是完全数",n);
return 0;
}#include <stdio.h>
#include<pthread.h>
int a[100]={0};
int j=0;
int n;
int x=0;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
void* judge(void *arg)
{
pthread_mutex_lock(&mutex);
x++;
printf("%d个线程 ",x);
if(n%x==0)
{
a[j]=x;
j++;
printf("%d是因数",x);
}
printf("\n");
pthread_mutex_unlock(&mutex);
return 0;
}
int main(){
int i;
printf("输入N\n");
scanf("%d",&n);
pthread_t th;
for(int i=0;i<n-1;i++)
{
pthread_create(&th, NULL,judge,NULL);
}
pthread_join(th,NULL);
int sum=0;
printf("因数有:");
for(i=0;a[i]!=0;i++)
{
sum=sum+a[i];
printf("%d ",a[i]);
}
printf("\n");
printf("sum=%d\n",sum);
if(sum==n)
printf("%d是完全数",n);
else
printf("%d不是完全数",n);
return 0;
}
运行结果截图
我是用Windows系统下Codeblocks写的代码,其中使用<pthread.h>头文件得自己重新配置一下。可能代码多多少少还是有些问题,不过能先把作业交上就行吧(叹气)。