Liczba bitów podzielna przez 3

0

Mam takie zadanie do wykonania:

Napisz funkcję, która w prostokątnej tablicy liczb prostokątnych zlokalizuje wartość o sumie bitów podzielnej przez 3. Współrzędne pierwszej znalezionej liczby spełniającej to kryterium są przekazywane (udostępniane) na zewnątrz funkcji.

Napisałem kod:

#include <iostream>

using namespace std;

void Zadanie1(int & wspolrzedna1,int & wspolrzedna2,short int tab[][3],int rozmiar1,int rozmiar2)
{
    int suma=0;
    for(int i=0;i<rozmiar1;i++)
    {
        for(int j=0;j<rozmiar2;j++)
        {
            for(int k=1;k<=16;k++)
            {
                suma=suma+tab[i][j]&1;
                tab[i][j]=tab[i][j]>>1;
            }
            if(suma%3==0)
            {
                wspolrzedna1=i;
                wspolrzedna2=j;
                return;
            }
        }
    }
}
int main()
{
    int wspolrzedna1=0;
    int wspolrzedna2=0;
    const int rozmiar1=2;
    const int rozmiar2=3;
    short int tab[rozmiar1][rozmiar2]=
    {
        {1,3, 5},
        {5,2,11}
    };
    Zadanie1(wspolrzedna1,wspolrzedna2,tab,rozmiar1,rozmiar2);
    cout << wspolrzedna1 << " " << wspolrzedna2 << endl;
    return 0;
}

Niestety program nie działa. Pokazuje że tą liczbą której liczba bitów jest podzielna przez 3 jest 2 co jest nieprawdą. Jak ktoś zlokalizuje błąd i mi pomoże będę bardzo wdzięczny.

1
        for(int j=0;j<rozmiar2;j++)
        {
            suma = 0;
            for(int k=1;k<=16;k++)

i

suma = suma + (tab[i][j] & 1);

lub suma += tab[i][j] & 1;

4

Zacznij od napisania funkcji liczącej sumę bitów w liczbie. Potem po prostu w/g wybranego algorytmu iteruj po tablicy.

5
unsigned short BitCount(unsigned value)
  {
   unsigned short count;
   for(count=0;value;++count) value&=(value-1);
   return count;
  }
4
_13th_Dragon napisał(a):
unsigned short BitCount(unsigned value)

Nowe procki mają instrukcję asemblera POPCNT robiącą dokładnie to.

Ale nie mam na tyle nowego kompa żeby się tym pobawić...

0

Temat stary, ale odświeżam bo problem nie został rozwiązany. Słusznie zauważył lukasz1235, że brakuje nawiasu w jednej linijce.

Tu jest poprawiony kod:

#include <iostream>

using namespace std;

void Zadanie1(int & wspolrzedna1,int & wspolrzedna2,int tab[][3],int rozmiar1,int rozmiar2)
{
    int suma=0;
    for(int i=0;i<rozmiar1;i++)
    {
        for(int j=0;j<rozmiar2;j++)
        {
            for(int k=1;k<=32;k++)
            {
                suma=suma+(tab[i][j]&1);
                tab[i][j]=tab[i][j]>>1;
            }
            if(suma%3==0)
            {
                wspolrzedna1=i;
                wspolrzedna2=j;
                return;
            }
        }
    }
}
int main()
{
    int wspolrzedna1=0;
    int wspolrzedna2=0;
    const int rozmiar1=2;
    const int rozmiar2=3;
    int tab[rozmiar1][rozmiar2]=
    {
        {1,3,5},
        {5,2,11}
    };
    Zadanie1(wspolrzedna1,wspolrzedna2,tab,rozmiar1,rozmiar2);
    cout << wspolrzedna1 << " " << wspolrzedna2 << endl;
    return 0;
}

Mimo to program nie działa. Oto reprezentacje bitowe poszczególnych liczb:
1(10)=1(2)
3(10)=11(2)
5(10)=101(2)
2(10)=10(2)
11(10)=1011(2)

Wobec tego program powinien wskazywać na 11, ponieważ ta liczba ma sumę bitów podzielną przez 3. Niestety program pokazuje współrzędne 0 1, czyli wskazuje na liczbę 3. Ktoś wie o co chodzi?

0
#include <iostream>
using namespace std;

int CountBits(int value)
{
     int sum = 0;

     for(int i = 0; i < sizeof(value)*8; i++)
     {
         if ( (value) & (1<<(i)) ) sum += 1;
     }

     return sum;
}

bool DivisibleByThree(int value)
{
     return ((CountBits(value)%3)==0);
}

int main() {
	int value = 7;
	cout<<CountBits(value)<<endl;
	cout<<DivisibleByThree(value);
	return 0;
}

Zgrabnie napisane - funkcja liczaca sume ustawionych bitow i druga, ktora mowi czy jest podzielna przez 3.

0

OGARNĄŁEM

#include <iostream>

using namespace std;

void Zadanie1(int & wspolrzedna1,int & wspolrzedna2,int tab[][3],int rozmiar1,int rozmiar2)
{
    int suma=0;
    for(int i=0;i<rozmiar1;i++)
    {
        for(int j=0;j<rozmiar2;j++)
        {
            for(int k=1;k<=32;k++)
            {
                suma=suma+(tab[i][j]&1);
                tab[i][j]=tab[i][j]>>1;
            }
            if(suma%3==0)
            {
                wspolrzedna1=i;
                wspolrzedna2=j;
                return;
            }
            else
                suma=0;
        }
    }
}
int main()
{
    int wspolrzedna1=0;
    int wspolrzedna2=0;
    const int rozmiar1=2;
    const int rozmiar2=3;
    int tab[rozmiar1][rozmiar2]=
    {
        {1,3,5},
        {5,2,11}
    };
    Zadanie1(wspolrzedna1,wspolrzedna2,tab,rozmiar1,rozmiar2);
    cout << wspolrzedna1 << " " << wspolrzedna2 << endl;
    return 0;
}
0

Bardzo źle ogarnąłeś.

  1. psujesz tablicę
  2. funkcja daje radę tylko z tablicami trzykolumnowymi, więc przy tym rozmiar 2 - bez sensu przekazano.
  3. liczenie liczby bitów jest beznadziejne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1