Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.78 KB | None | 0 0
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <math.h>
  6.  
  7. int isPrime(int X) {
  8.    
  9.     if (X == 1) return 0;
  10.     if (X == 2) return 1;
  11.    
  12.     int i;
  13.     double limit = sqrt(X);
  14.    
  15.     for (i = 2; i <= limit; i++) {
  16.         if (X % i == 0) {
  17.             return 0;
  18.         }
  19.     }
  20.     return 1;
  21. }
  22.  
  23.  
  24. int zbirCifara(int t) {
  25.     int zbir = 0;
  26.    
  27.     while (t > 0) {
  28.         zbir += t % 10;
  29.         t /= 10;       
  30.     }
  31.    
  32.     return zbir;
  33. }
  34.  
  35. int main(int argc, char **argv) {
  36.    
  37.     int err;
  38.     int id, np;
  39.    
  40.     err = MPI_Init(&argc, &argv);
  41.     MPI_Comm_rank(MPI_COMM_WORLD, &id);
  42.     MPI_Comm_size(MPI_COMM_WORLD, &np);
  43.     MPI_Status status; 
  44.    
  45.     int A;  
  46.    
  47.     if (id == 0) {
  48.         printf("\n");      
  49.         printf("Unesi A:");
  50.         scanf("%d", &A);
  51.     }  
  52.    
  53.     MPI_Bcast(&A, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  54.    
  55.     int T = A / np;
  56.     int L = 1 +  id * T;
  57.     int R; 
  58.    
  59.     if (id != np - 1) {
  60.         R = T * (id + 1) + 1;      
  61.     } else {
  62.         R = A;
  63.     }  
  64.    
  65.     int *primes = (int*) malloc((T/2)*sizeof(int));
  66.    
  67.     int k = 0;
  68.     int i;
  69.    
  70.     for (i = L; i <= R; i++) {
  71.         if (isPrime(i)) {
  72.             primes[k++] = i;
  73.         }
  74.     }  
  75.    
  76.     int *greens = (int*) malloc((A)*sizeof(int));
  77.     int z = 0;
  78.    
  79.     for (i = 0; i < k; i++) {
  80.         if (isPrime(zbirCifara(primes[i]))) {
  81.             greens[z++] = primes[i];
  82.         }
  83.    
  84.     }
  85.    
  86.     if (id == 0) {
  87.         int last = z;
  88.         int j;
  89.         int localZ;    
  90.         for (j = 1; j < np; j++) {
  91.             MPI_Recv(&localZ, 1, MPI_INT, j, 20, MPI_COMM_WORLD, &status);
  92.             MPI_Recv(&greens[last], localZ, MPI_INT, j, 21, MPI_COMM_WORLD, &status);
  93.             last += localZ;
  94.         }
  95.        
  96.         FILE *f = fopen("greensOut.dat", "w");     
  97.        
  98.         for (i = 0; i < last; i++) {
  99.             fprintf(f, "%d\n", greens[i]);         
  100.         }
  101.        
  102.     } else {
  103.         MPI_Send(&z, 1, MPI_INT, 0, 20, MPI_COMM_WORLD);
  104.         MPI_Send(greens, z, MPI_INT, 0, 21, MPI_COMM_WORLD);
  105.     }  
  106.    
  107.    
  108.     err = MPI_Finalize();
  109.    
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement