You are on page 1of 2

#include <stdio.

h>
#include <mpi.h>
#include <omp.h>
#define MAX_THREADS 5

int power(int, int);

int main()
{
int n , sum = 0, t, remainder, digits = 0;
int size, rank;
int tid,nthreads, nbin;
int Psum=0, sum[MAX_THREADS]={0};
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
nbin = 250000/size;
int global_sum;

#pragma omp parallel private(tid){


int i;
nthreads = omp_get_num_threads();
tid = omp_get_thread_num();

for (i=5000*rank+tid; i<nbin*(rank+1); i+=nthreads){


check_armstrong(n);
}
if (check_armstrong(n) == 1)
printf("%lld is an armstrong number.\n", n);
sum[tid]+=n;
else
printf("%lld isn't an armstrong number.\n", n);

}
for (tid=0; tid<nthreads; tid++)
Psum += sum[tid];

MPI_Reduce(&Psum, &global_sum, MPI_INT, MPI_SUM, 0 ,MPI_COMM_WORLD);

// Print the result


if (world_rank == 0) {
printf("Total sum = %f, avg = %f\n", global_sum, global_sum / (size * nbin));
}

MPI_Finalize();
return 0;
}

int check_armstrong(L n) {
L sum = 0, t;
int remainder, digits = 0;

t = n;

while (t != 0) {
digits++;
t = t/10;
}
t = n;

while (t != 0) {
remainder = t%10;
sum = sum + power(remainder, digits);
t = t/10;
}

if (n == sum)
return 1;
else
return 0;
}

L power(int n, int r) {
int c;
L p = 1;

for (c = 1; c <= r; c++)


p = p*n;

return p;
}

You might also like