#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"mpi.h"
int isShui(int k)
{
if(k == 0||k == 1) return 0;
char num_str[4];
sprintf(num_str, "%d", k);
int digits = strlen(num_str);
int total = 0;
for (int i = 0; i < digits; i++) {
int digit = num_str[i] - '0';
total += digit * digit * digit* digit;
}
return k == total;
}
int main(int argc,char **argv)
{
int rank,size;
int i,j,cnt;
int n;
int *num;
int a = 1000,b = 10000;
n = b-a;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if(rank==0)
{
// printf("Please input n:\n");
// scanf("%d",&n);
num = (int*)malloc(sizeof(int)*n);
//printf("Please input %d data:\n",n);
int i;
for(i=0,j=a;i<n;i++,j++)
num[i] = j;
//scanf("%d",&num[i]);
}
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
//scatterv
// //********************************************************************
// // 计算每个进程负责处理的数据量
int* recvcounts = (int*) malloc(size * sizeof(int));
int* displs = (int*) malloc(size * sizeof(int));
int cs = n / size;
int r = n % size;
for (int i = 0; i < size; i++) {
recvcounts[i] = cs;
if (i < r) {
recvcounts[i] += 1;
}
displs[i] = (i > 0 ? displs[i-1] + recvcounts[i-1] : 0);
}
// 将数据 scatterv 分发到每个进程
int* recvbuf = (int*) malloc(recvcounts[rank] * sizeof(int));
MPI_Barrier(MPI_COMM_WORLD);
MPI_Scatterv(num, recvcounts, displs, MPI_INT,
recvbuf, recvcounts[rank], MPI_INT, 0, MPI_COMM_WORLD);
//***********************************************************
int *suarr = (int*)malloc(sizeof(int)*recvcounts[rank]);
for(i = 0,j = 0;i<recvcounts[rank];i++)
{
if(isShui(recvbuf[i]))//判断素数
{
suarr[j] = recvbuf[i];
j++;
}
}
MPI_Reduce(&j,&cnt,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);//总共cnt个素数
//Gatherv
//**********************************************************************************
MPI_Gather(&j,1,MPI_INT,recvcounts,1,MPI_INT,0,MPI_COMM_WORLD);//接收数量的数组
recvcounts[rank] = j;
for(i = 0;i<size;i++)
displs[i] = (i>0?displs[i-1]+recvcounts[i-1]:0);
int *ans = (int*)malloc(sizeof(int)*cnt);
MPI_Gatherv(suarr,j,MPI_INT,ans,recvcounts,displs,MPI_INT,0,MPI_COMM_WORLD);
//***********************************************************************************
if(rank == 0)
{
for(i = 0;i<cnt;i++)
{
printf("%d ",ans[i]);
}
printf("\n");
}
MPI_Finalize();
return 0;
}
虽然结果可以打印出来,但是为什么会出现红色框里面的内容,改怎么解决。
该程序的原题目为:
若一个四位数,它的每个位上的数字的4次幂之和等于它本身。例如:1634=14+63+33+44。请编写一个并行程序,把1000-9999之间的数分配给各进程,找出其中的水仙花数并打印出来。在你的主目录下,保存的文件名为rose.c。