实现多线程程序测试一个数是否是完全数

实现多线程程序测试一个数是否是完全数
实现一个多线程程序测试一个数是否是完全数。如果一个数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>头文件得自己重新配置一下。可能代码多多少少还是有些问题,不过能先把作业交上就行吧(叹气)。

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用多线程测试一个是否是完全数。具体实现方法如下: 1. 定义一个is_perfect_number(num),用于判断一个是否是完全数完全数是指所有因子(除了本身)的和等于该本身的。 2. 在主程序中,创建多个线程,每个线程负责测试一个是否是完全数。 3. 在每个线程中,调用is_perfect_number(num)函,判断该是否是完全数。 4. 如果是完全数,则输出该和它的因子;否则输出该不是完全数。 下面是一个示例代码: ```python import threading def is_perfect_number(num): factors = [] for i in range(1, num): if num % i == 0: factors.append(i) if sum(factors) == num: return True else: return False def test_number(num): if is_perfect_number(num): print(num, "是完全数,因子为:", end="") for factor in range(1, num): if num % factor == 0: print(factor, end=" ") print() else: print(num, "不是完全数") if __name__ == "__main__": nums = [6, 28, 496, 8128, 33550336] threads = [] for num in nums: t = threading.Thread(target=test_number, args=(num,)) threads.append(t) t.start() for t in threads: t.join() ``` 运行结果如下: ``` 6 是完全数,因子为:1 2 3 28 是完全数,因子为:1 2 4 7 14 496 是完全数,因子为:1 2 4 8 16 31 62 124 248 8128 是完全数,因子为:1 2 4 8 16 32 64 127 254 508 1016 2032 4064 33550336 是完全数,因子为:1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 ``` 可以看到,程序成功地测试了每个是否是完全数,并输出了它们的因子。 ### 回答2: 实现一个多线程程序用于测试一个是否是完全数的方法可以分为以下几个步骤: 1.定义一个类,实现Runnable接口,图中为CheckPerfectNum。 2.在类中定义变量num,该变量为待测试。 3.在类的构造方法中传入待测试,并将其赋值给num。 4.在类中实现run()方法,这是多线程任务的主要执行体。 5.在run()方法中,用一个for循环判断从1到num-1的每个是否是num的因,如果是就将其加入到一个集合 factors 中。如下面代码所示: for (int i = 1; i < num; i++) { if (num % i == 0) { factors.add(i); } } 6.然后将集合 factors 中的所有元素相加,得到和 sum。 7.最后判断 sum 是否等于 num,如果是则表示 num 是完全数,否则不是完全数。如下面代码所示: if (sum == num) { System.out.println(num + " is a perfect number."); } else { System.out.println(num + " is not a perfect number."); } 8.在主方法中,创建一个 CheckPerfectNum 对象,并将待测试作为参传入。然后创建一个线程对象并启动该线程,调用 start() 方法即可。 下面是完整代码示例: import java.util.ArrayList; import java.util.List; public class CheckPerfectNum implements Runnable { private int num; private List<Integer> factors = new ArrayList<>(); public CheckPerfectNum(int num) { this.num = num; } @Override public void run() { for (int i = 1; i < num; i++) { if (num % i == 0) { factors.add(i); } } int sum = 0; for (int factor : factors) { sum += factor; } if (sum == num) { System.out.println(num + " is a perfect number."); } else { System.out.println(num + " is not a perfect number."); } } public static void main(String[] args) { CheckPerfectNum job = new CheckPerfectNum(28); Thread thread = new Thread(job); thread.start(); } } 通过上述步骤,我们就可以实现一个多线程程序用于测试一个是否是完全数。当然,实际上我们还可以进一步优化这个程序,比如加入参校验、多线程处理多个等功能。 ### 回答3: 完全数指的是它的因子(不包括本身)之和等于它本身的正整实现一个多线程程序测试一个是否是完全数的步骤如下: 首先,输入一个正整num,我们需要使用多线程的方式来测试num是否是完全数。 为了让多线程工作,我们需要用一个线程调用函求num的因子,另一个线程对这些因子进行求和并判断是否等于num。 因子求解线程应该遍历1到num-1的所有,并判断是否为num的约。如果是,将约保存到一个临时组中。 第二个线程应该处理上一个线程计算得到的约组,将约之和与原num比较。如果相等,则num为完全数,否则就不是完全数。 在计算约的过程中,可以使用一个全局变量shared_num保存num,供两个线程共享使用。同时还需要使用互斥锁确保同一时刻只有一个线程可以对共享变量进行操作。 代码如下: ```python import threading # 定义互斥锁 lock = threading.Lock() # 定义全局变量 shared_num = 0 # 求约的线程函 def factor_calculator(num, factor_list): global shared_num, lock for i in range(1, num): if num % i == 0: lock.acquire() # 上锁 factor_list.append(i) lock.release() # 解锁 # 检测是否为完全数的线程函 def perfect_number_tester(num, factor_list): global shared_num, lock f_sum = 0 for f in factor_list: f_sum += f if f_sum == num: print(num, "is a perfect number.") else: print(num, "is not a perfect number.") # 主函 def main(): global shared_num num = int(input("Please input a number: ")) shared_num = num factors = [] # 创建线程 factor_thread = threading.Thread(target=factor_calculator, args=(num, factors)) perfect_thread = threading.Thread(target=perfect_number_tester, args=(num, factors)) # 启动线程 factor_thread.start() perfect_thread.start() # 等待线程结束 factor_thread.join() perfect_thread.join() if __name__ == "__main__": main() ``` 以上是实现一个多线程程序测试一个是否是完全数的步骤及代码示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值