czy binarna liczba jest palindromem

0

Witam serdecznie , potrzebuje pomocy ze sprawdzeniem czy liczba z danego przedziału ( powiedzmy od 100 do 200) po zmianie na liczby binarne jest palindromem.

#include <iostream>
using namespace std;

unsigned toString(unsigned n, unsigned p, char* code);
bool isPalindrom(char* s, unsigned k);

int main() {
  unsigned m, n, p; // zakres liczb m..n; p: podstawa zapisu
  unsigned k;       // liczba cyfr w zapisie przy podstawie p  
  char code[33]={0};// Co najwyżej 32 cyfry rozwinięcia unsigned

  setlocale(LC_ALL, "pl-PL.UTF8");
  cout<<"Program sprawdza, które liczby całkowite >0 z zakresu m..n\n";
  cout<<"są w zapisie przy podstawie p palindromami.\n"; 
  cout<<"Liczby na wejściu podawane są w zapisie dziesiętnym.\n";
  cout<<"   m, n <= 0 --> koniec programu.\n";
  cout<<"Uwaga: podstawa p musi być ze zbioru {2 .. 36}.\n";

  while(true) { // Konwersacja 
    cout<<"\nzakres m..n i podstawa p: m n p = ";
    cin>>m>>n>>p;
    if(m<=0 || n<=0) break;

    for(unsigned i = m; i<=n; ++i) {
      k = toString(i, p, code);
      if(isPalindrom(code, k))
        cout<<i<<" = "<<code<<endl;
    }
  }
  cout<<"\nKoniec programu\n";
}

// Zwraca true jeśli liczba k-cyfrowa w s jest palindromem.
bool isPalindrom(char* s, unsigned k) 
{
    return 0;
    // TODO Napisać prawidłową treść funkcji isPalindrom(...).
 
}

// Konwersja liczby dodatniej n na postać znakową
// w zapisie przy podstawie p do tablicy code.
// Funkcja zwraca liczbę znaków rozwinięcia przy podstawie p.

unsigned toString(unsigned n, unsigned p, char* code) 
{
   
    
    // TODO Napisać prawidłową treść funkcji konwersji toString(...).

  return 0;
}
3
/* to było źle
bool isBinaryPalindrome(unsigned int x)
{
     unsigned int y = 0;
     while (y < x) {
          y = (y << 1) + x % 2;
          x = x >> 1;
     }
     return x == y;
} */

unsigned int binaryReverse(unsigned int x)
{
    unsigned int y = 0;
    while (x) {
        y = y*2 + x%2;
        x = x/2;
    }
    return y;
}

bool isBinaryPalindrome(unsigned int x)
{
    return x == binaryReverse(x);
}

https://godbolt.org/z/hqxqGb

0

a jak mam interpretować ten kod zakomentowany który jest zły?

0

zrobiłem coś takiego niestety nie działa na przykładzie przedziału liczb 1000 2000 z podstawą 36, może ma ktoś pomysł jak to przerobić troszkę?

#include <string>
#include <math.h>

using namespace std;

std::string toString(unsigned p, char* code, int numberToConvert);
bool isPalindrom(char* s, std::string k);

int main() {
    unsigned m, n, p; // zakres liczb m..n; p: podstawa zapisu
    std::string k;       // liczba cyfr w zapisie przy podstawie p  
    char code[33] = { 0 };// Co najwyżej 32 cyfry rozwinięcia unsigned

    setlocale(LC_ALL, "pl-PL.UTF8");
    cout << "Program sprawdza, które liczby całkowite >0 z zakresu m..n\n";
    cout << "są w zapisie przy podstawie p palindromami.\n";
    cout << "Liczby na wejściu podawane są w zapisie dziesiętnym.\n";
    cout << "   m, n <= 0 --> koniec programu.\n";
    cout << "Uwaga: podstawa p musi być ze zbioru {2 .. 36}.\n";

    while (true) { // Konwersacja 
        cout << "\nzakres m..n i podstawa p: m n p = ";
        cin >> m >> n >> p;
        if (m <= 0 || n <= 0) break;

        for (unsigned i = m; i <= n; ++i) {
            k = toString(p, code, i);

            if (isPalindrom(code, k))
                cout << i << " = " << k << endl;
        }
    }
    cout << "\nKoniec programu\n";
}

// Zwraca true jeśli liczba k-cyfrowa w s jest palindromem.
bool isPalindrom(char* s, std::string stringOfNumber) {
    bool result = true;
    int stringLength = stringOfNumber.length();
    int k = 0;
    for (int i = 0; i < stringLength; ++i) {
        int j = 1 + i;
        if (stringOfNumber[i] != stringOfNumber[stringLength - j]) {
            result = false;
        }
    }

    return result;
}

std::string toString(unsigned p, char* code, int numberToConvert) {
    std::string numberInString = "";
    int convertedNumber;
    char hex[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
    while (numberToConvert > 0)
    {
        convertedNumber = numberToConvert % p;
        numberInString = hex[convertedNumber] + numberInString;
        numberToConvert = numberToConvert / p;
    }

    return numberInString;
}```
0

MicrosoftTeams-image.png

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