【现代操作系统第二章习题】实现多线程程序测试一个数是否是完全数

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

/**
 * @Author: lrc
 * @Date: 11/14/2023-11:01 AM
 * @Desc:
 **/

package main

import (
	"fmt"
	"os"
	"strconv"
	"sync"
)

var buffer []int

var mutex sync.Mutex

var wg sync.WaitGroup

// isFactor 判断一个数是否是N的因数,如果是,就放到缓冲区中
func isFactor(num, N int) {

	if N%num == 0 && num != N {
		mutex.Lock()
		buffer = append(buffer, num)
		mutex.Unlock()
	}
}

func isPerfect(N int) bool {
	sum := 0
	for _, num := range buffer {
		sum += num
	}
	if sum == N {
		return true
	}
	return false
}

func main() {

	N, _ := strconv.Atoi(os.Args[1])
	P, _ := strconv.Atoi(os.Args[2])
	//sqrtN := int(math.Sqrt(float64(N))) //取平方根
	buffer = make([]int, 0)

	wg.Add(P)

	for i := 0; i < P; i++ {
		start := i*N/P + 1
		end := (i + 1) * N / P
		go func(start, end int) {
			for num := start; num <= end; num++ {
				isFactor(num, N)
			}
			wg.Done()
		}(start, end)
	}
	wg.Wait()
	//test
	//for _, v := range buffer {
	//	fmt.Println(v)
	//}
	result := isPerfect(N)
	fmt.Println(result)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值