C++多线程完成操作系统作业

实现多线程程序测试一个数是否是完全数
实现一个多线程程序测试一个数是否是完全数。如果一个数N的所有因数(不包括N本身)的和还是N,则N是一个完全数,如6和28,输入是一个整数N,如果N是完全数则输出true,否则输出false。主程序从命令行读取数字N和P,创建P个线程,将1~N这N个数分给各个线程,保证两个线程不会分到相同的数。每个线程判断这些树是不是N的因数,如果是,那么放到一个共享的缓冲区中。在父进程中用合适的同步方法等待所有的线程执行完毕后,判断N是否是完全数,即判断是否N的所有因数之和还是N(提示:你可以将测试的数限定在1至N的平方根来加速计算过程。)

题目来自操作系统的课后习题。

#include <iostream>
#include <thread>
using namespace std;

int sum = 0;

void  Is_yinshu(int N,int low,int up)
{ 
	if (low <= 0)
	{
		cout << "下限不能小于0" << endl;
		return;
	}
	for (int i = low; i <= up; i++) {
		if (N % i == 0)
		{
			cout << i << "是" << N << "的因数" << endl;
			sum += i;
		}
	 }
}


int main()
{
	int N, P;
	cout << "请输入正整数N和P:";
	cin >> N >> P;
	thread* ptr = new thread[P];
	if (N/2 <= P)//需要处理的数,小于所开线程
	{

		for (int i = 0; i < N/2; i++)
		{
			ptr[i] = thread(Is_yinshu,N, i+1, i+1);
		}
	}
	else
	{
		int flag = N / 2 / P;
		for (int i = 0; i < P-1; i++)//可能涉及到不能均等分配,前P-1个先分配
		{
			ptr[i] = thread(Is_yinshu,N, i*flag+1, i*flag+flag);

		}
		ptr[P - 1] = thread(Is_yinshu, N,(P-1) * flag+1, N / 2);
	}

	 for (int i = 0; i < P; i++)
	{
		 if (ptr[i].joinable()) {
			 ptr[i].join();
		 };
	} 
   delete[] ptr;
   cout << endl;
	if (sum == N) cout << N<<"是完全数"<<endl;
	else cout << N << "不是完全数"<<endl;
	return 0;
}
 

新手上路,请多多指教。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值