Wyszukiwanie binarne - while

0

Witam,
nie mogę sobie poradzić z zadankiem http://pl.spoj.com/WSDOCPP/problems/PBINARY/. Dopiero zaczynam przygodę z algorytmiką, ale nie mogę sobie poradzić z whilem. Dodałem trochę kodu, żeby wypisywało powtórzenia i wyrzuca mi dla l = 0 i tak i nie.

Poniżej załączam kod:

#include <iostream>
#include <cstdio>

using namespace std;
int main()
{
    int n;
    scanf("%d", &n);

    int tab[n];
    for (int i = 0; i < n; i++) {
        cin >> tab[i];
    }
    int q;
    scanf("%d", &q);

    int tab2[q];
    for (int j = 0; j < q; j++) {
        cin >> tab2[j];
    }

    int p = 0;
    int k = n - 1;
    int sr;
    for (int l = 0; l < q; l++) {
        while (p <= k) {
            sr = (k + p) / 2;
            if (tab2[l] < tab[sr]) {
                k = sr - 1;
            }
            else if (tab2[l] > tab[sr]) {
                p = sr + 1;
            }
            else {
                cout << "TAK" << endl;
                cout << "Powtórzenie nr: " << l << endl;
                break;
            }
        }
        cout << "NIE" << endl;
        cout << "Powtórzenie nr: " << l << endl;
    }
}


0

C++ ma już wyszukiwanie binarne, zajrzyj do <algorithm>, jeżeli zaś chcesz w C to:

#include <stdio.h>
#include <stdlib.h>

int main()
  {
   size_t i,lf,rt,mid,tcount,size;
   int *tb,value;
   scanf("%u",&size);
   tb=malloc(size*sizeof(int));
   for(i=0;i<size;++i) scanf("%d",tb+i);
   for(scanf("%u",&tcount);tcount--;puts(lf<rt?"TAK":"NIE"))
     {
      for(scanf("%d",&value),lf=0,rt=size;lf<rt;)
        {
         mid=(lf+rt)>>1;
         if(tb[mid]>value) rt=mid;
         else if(tb[mid]<value) lf=mid+1;
         else break;
        }
     }
   free(tb);
   return 0;
  }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.