题目:如果一个数N(不包括N本身)的所有因数和仍然为N,则N为完全数。如果一个数N(不包括N本身)的所有因子之和仍然是N,则N是一个完整的数字,比如6和28,输入是一个整数N,如果N是一个完整的数字,则输出true,否则输出假。主程序从命令行读取数字N和P,创建P个线程,将N个数字1到N分配给每个线程,保证两个线程不会被分配相同的数字。每个线程判断这些树是否是N的因子,如果是,则将它们放入共享缓冲区。在父进程中使用合适的同步方式等待所有线程执行完毕,然后判断N是否是一个完整的数,即判断N的所有因子之和是否还是N(提示:可以限制测试次数为1到N的平方根,用于加快计算过程。)首先,该题只需要判断一个数是否为完全数,并且需要通过多线程完成。那么每个线程只是一个完全数的子问题:求N的因数。也就是判断N%cnt==0是否为零。如果为零,则表示cnt是N的一个因子,计入和。错误思路:就是简单的创建N个线程,让每个线程依次判断1...N-1是否是N的因数。更正:可以有多个线程,应该允许多个线程竞争子问题的执行,但是必须保证每个线程不能同时执行子问题,导致同一个因子计算多次次。因此,必须锁定子问题。void*isFactor(void*args){while(/*线程等待条件*/){pthread_mutex_lock(&mutex);//判断是否是因素pthread_mutex_unlock(&mutex);}returnNULL;}保证1...N-1not会反复判断:每个线程都会竞争mu??tex_lock,但是同一时刻只有一个线程可以执行子问题。所以我们设置一个值cnt来表示数字1...N-1。而cnt的改变只能在锁内进行,这样就保证了1...N-1中的每个数只会执行一次。线程等待结束条件:sum!=N,所有线程都没有结束,只有一个线程在访问锁。本线程访问完成后释放锁资源,然后与其他线程竞争锁资源。每次竞争锁资源的线程数保持不变,始终是创建的线程数。sum==N后,所有线程同时结束。因此,线程等待条件为sum!=N。intcnt=1,sum=0;void*isFactor(void*args){while(sum!=N){pthread_mutex_lock(&mutex);如果(N%cnt==0){sum+=cnt;}cnt++;pthread_mutex_unlock(&??mutex);}returnNULL;}优化根据题目,如果n是N的因子,那么N/n也一定是N的因子,所以其实只需要$$\sqrt{N}$$判断在最多。因此程序可修改为:intcnt=2,sum=1;void*isFactor(void*args){while(cnt
