#include <stdio.h>
#include "mpi.h"
int main(int argc, char *argv[]){
int myRank;
int size;
int fact;
int lower,upper;
int i;
double local_result = 1.0;
double total;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(myRank==0){
}
MPI_Bcast(&fact, 1, MPI_INT, 0, MPI_COMM_WORLD);
if(myRank==0){
lower = 1;
}else
lower = myRank * (fact / size) + 1;
if(myRank==(size-1))
upper = fact;
else
upper = (myRank + 1) * (fact / size);
for(i=lower;i<=upper;i++){
local_result = local_result * (double)i;
}
MPI_Reduce(&local_result, &total, 1, MPI_DOUBLE, MPI_PROD, 0, MPI_COMM_WORLD);
if(myRank==0){
printf("The factorial of %d is %lf, and was calculated using %d processes\n",fact
,total
,size
); }
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJtcGkuaCIKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pewppbnQgbXlSYW5rOwogICAgaW50IHNpemU7CiAgICBpbnQgZmFjdDsKICAgIGludCBsb3dlcix1cHBlcjsKICAgCiBpbnQgaTsKICAgIGRvdWJsZSBsb2NhbF9yZXN1bHQgPSAxLjA7CiAgICBkb3VibGUgdG90YWw7CiAgICBNUElfSW5pdCgmYXJnYywmYXJndik7CiAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmbXlSYW5rKTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKICAgIGlmKG15UmFuaz09MCl7CiAgICAgICAgcHJpbnRmKCJFbnRlciBhIG51bWJlcjoiKTsKICAgICAgICBzY2FuZigiJWQiLCZmYWN0KTsKICAgIH0KTVBJX0JjYXN0KCZmYWN0LCAgMSwgICBNUElfSU5ULCAwLCAgTVBJX0NPTU1fV09STEQpOyAKICAgIGlmKG15UmFuaz09MCl7CiAgICAgICAgbG93ZXIgPSAxOwogICAgfWVsc2UKICAgICAgICBsb3dlciA9IG15UmFuayAqIChmYWN0IC8gc2l6ZSkgKyAxOwogICAgaWYobXlSYW5rPT0oc2l6ZS0xKSkKICAgICAgICB1cHBlciA9IGZhY3Q7CiAgICBlbHNlCiAgICAgICAgdXBwZXIgPSAobXlSYW5rICsgMSkgKiAoZmFjdCAvIHNpemUpOwogICAgZm9yKGk9bG93ZXI7aTw9dXBwZXI7aSsrKXsKICAgICAgICBsb2NhbF9yZXN1bHQgPSBsb2NhbF9yZXN1bHQgKiAoZG91YmxlKWk7CiAgICB9Ck1QSV9SZWR1Y2UoJmxvY2FsX3Jlc3VsdCwgJnRvdGFsLCAgICAxLCAgICBNUElfRE9VQkxFLCAgIE1QSV9QUk9ELCAgICAwLCAgICBNUElfQ09NTV9XT1JMRCk7IAoKICAgICAgaWYobXlSYW5rPT0wKXsKICAgICAgICBwcmludGYoIlRoZSBmYWN0b3JpYWwgb2YgJWQgaXMgJWxmLCBhbmQgd2FzIGNhbGN1bGF0ZWQgdXNpbmcgJWQgcHJvY2Vzc2VzXG4iLGZhY3QsdG90YWwsc2l6ZSk7CiAgICB9CiAgICBNUElfRmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9