Guest User

Untitled

a guest
Jul 17th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #define MAX_BR_EL 100
  3.  
  4. /* spaja dva uredjena niza, na neopadajuci nacin*/
  5. void merge(int levi[], int desni[], int rez[], int n, int m){
  6.     int i,j,p;
  7.     i = j = p = 0;
  8.     while( i < n && j < m){
  9.         if (levi[i] < desni[j]){
  10.             rez[p] = levi[i];
  11.             p++; i++;
  12.         } else if(levi[i] > desni[j]){
  13.             rez[p] = desni[j];
  14.             p++; j++;
  15.         } else{
  16.             rez[p] = levi[i];
  17.             p++; i++;
  18.             rez[p] = desni[j];
  19.             p++; j++;
  20.         }
  21.  
  22.  
  23.     }
  24.  
  25.     while(i<n){
  26.         rez[p] = levi[i];
  27.         p++; i++;
  28.     }
  29.  
  30.     while(j<m){
  31.         rez[p] = desni[j];
  32.         p++; j++;
  33.     }
  34. }
  35.  
  36. /* sortira niz, na neopadajuci nacin, koristeci mergesort algoritam otprilike :D*/
  37. int mergeSort(int niz[],int n){
  38.     int levi[MAX_BR_EL],desni[MAX_BR_EL];
  39.     int x = n,i,k;
  40.     if (x==1){
  41.         return niz[x-1];
  42.     }else{
  43.         for(i = 0; i < x/2; i++){
  44.             levi[i] = niz[i];
  45.         }
  46.         k=0;
  47.         for(i = x/2; i < x; i++,k++){
  48.             desni[k] = niz[i];
  49.         }
  50.  
  51.         mergeSort(levi,x/2);
  52.         mergeSort(desni,x-x/2);
  53.     }
  54.  
  55.     merge(levi,desni,niz,x/2,x-x/2);
  56. }
  57.  
  58. /* glavni program */
  59. void main(){
  60.     int niz[MAX_BR_EL];
  61.     int i,j,n;
  62.  
  63.     while(1){
  64. //unos broja elemenata niza (n)
  65.         printf("Unesi broj elemenata niza: ");
  66.         scanf("%d",&n);
  67.         printf("\n");
  68.         if (n<=0 || n > MAX_BR_EL){break;}
  69. //unosi elemente       
  70.         for (i = 0; i < n ; i++){
  71.             printf("Unesi %d. element niza: ",i+1);
  72.             scanf("%d",&niz[i]);
  73.             printf("\n");
  74.         }
  75. //sortira niz
  76.         mergeSort(niz,n);
  77. //ispituje da li je stepen dvojke; ako nije ispisuje poziciju i pretvara broj u nulu
  78.         for (i = 0; i < n ; i++){
  79.             if( niz[i] < 0 || ! stepenDvojke(niz[i])){
  80.                 printf("%d. element nije stepen dvojke; ",i+1);
  81.                 niz[i] = 0;
  82.             }
  83.         }
  84. //sve brojeve koji su jednaki nuli (nisu stepen dvojke) izbacuje iz niza
  85.         j = 0;
  86.         for (i = 0; i < n ; i++){
  87.             if (niz[i] != 0){
  88.                 niz[j] = niz[i];
  89.                 j++;
  90.                 niz[i] = 0;
  91.             }
  92.         }
  93.         n = j;
  94. //ispisuje konacni niz
  95.         if (n == 0){
  96.             printf("\n\nNijedan element nije bio stepen dvojke.");
  97.         } else{
  98.             printf("\n\nElementi koji su stepeni dvojke:\n\t");
  99.             for (i = 0; i < n ; i++){
  100.                 printf("%d ",niz[i]);
  101.             }
  102.         }
  103.         printf("\n\n");
  104.        
  105.     }
  106.     printf("\nKRAJ");
  107.     getchar();
  108.     getchar();
  109. }
  110.  
  111. /* funkcija koja proverava da li je broj stepen dvojke*/
  112. int stepenDvojke(int x){
  113.     int y;
  114.     if(x == 1 || x == 0){
  115.         return 0;
  116.     }
  117.     while (x != 2){
  118.         y = x;
  119.         y /= 2;
  120.         y *= 2;
  121.         if (y != x){
  122.             return 0;
  123.         }
  124.         x /=2;
  125.     }
  126.     return 1;
  127. }
Add Comment
Please, Sign In to add comment