实现一个多线程程序测试一个数是否是完全数。如果一个数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)
}


被折叠的 条评论
为什么被折叠?



