SPOJ - Czarodziejskie lusterko

0

Witam
mam problem z zadaniem Czarodziejskie lusterko. Program działa lecz sędzia nie przyjmuje mojego rozwiązania. Czy mógłby mi ktoś powiedzieć gdzie jest błąd?
Link do zadania: http://pl.spoj.com/problems/AL_05_01/
Poniżej mój kod:

#include <iostream>

using namespace std;

string DecToBin (unsigned long long int liczbaDziesietna)
{
    unsigned long long int wynik;
    string liczbaDwojkowaLiteraPOM, liczbaDwojkowaLitera;

    while(liczbaDziesietna!=0)
    {
        wynik = liczbaDziesietna%2;
        liczbaDziesietna = liczbaDziesietna/2;
        liczbaDwojkowaLiteraPOM += wynik + 48;
    }

    int dlugosc=liczbaDwojkowaLiteraPOM.length();
    for (int j=0; j<dlugosc; j++)
    {
        liczbaDwojkowaLitera += liczbaDwojkowaLiteraPOM[dlugosc-j-1];
    }

    return liczbaDwojkowaLitera;
}

string odbicieLiczby (string liczbaDwojkowaLitera)
{
    string odwroconaLiczbaDwojkowa;
    int dlugosc = liczbaDwojkowaLitera.length();

    for(int j=0; j<dlugosc; j++)
    {
        odwroconaLiczbaDwojkowa += liczbaDwojkowaLitera[dlugosc-j-1];
    }

    return odwroconaLiczbaDwojkowa;
}

long int potega(long int podstawa, int wykladnik)
{
    int wynik = 1;

    for (int i = 0; i<wykladnik; i++)
        wynik*=podstawa;

    return wynik;
}

unsigned long long int BinToDec (string odwroconaLiczbaDwojkowa)
{
    unsigned long long int odwroconaLiczbaDziesietna=0, odwroconaLiczbaDziesietnaPOM=0;
    int dlugosc = odwroconaLiczbaDwojkowa.length();

    for (int i=0; i<dlugosc; i++)
    {
        odwroconaLiczbaDziesietnaPOM = odwroconaLiczbaDwojkowa[dlugosc-i-1]-'0';
        odwroconaLiczbaDziesietna += odwroconaLiczbaDziesietnaPOM * potega(2,i);
    }

    return odwroconaLiczbaDziesietna;
}

int main()
{
    unsigned long long int liczbaDziesietna;

    while(cin >> liczbaDziesietna)
    {
        cout << BinToDec(odbicieLiczby(DecToBin (liczbaDziesietna))) << endl;
    }

    return 0;

}

0

Nie pamiętam już SPOJ-a, jaki dokładny komunikat jest zwracany?

0

Dla liczby 2^64-3, program zwraca tę samą liczbę. Jest możliwość, że będzie to ta sama liczba, ale tylko, gdy jest symetryczna, a ta nie jest (zaczyna się na "111…" a kończy na "…101").

https://ideone.com pewnie już używasz, możesz używać też www.wolframalpha.com do sprawdzania:

  1. Konwersja z liczby dziesiętnej na binarną: https://www.wolframalpha.com/input/?i=binary+2%5E64-3
  2. Odwracanie ciągu znaków (bez "_2" na końcu!): https://www.wolframalpha.com/input/?i=reverse+1111111111111111111111111111111111111111111111111111111111111101
  3. Konwersja z liczby binarnej na dziesiętną (najlepiej z "_2" na końcu): https://www.wolframalpha.com/input/?i=decimal+1111111111111111111111111111111111111111111111111111111111111101_2
1

Wymodziłem takie rozwiązanie w Pythonie:

import fileinput

def mirrorBinNumber(num):
    return int(bin(num)[:1:-1], 2)

for line in fileinput.input():
    print(mirrorBinNumber(int(line)))

Jest akceptowalne ;) Zwykły input w pętli while nie chciał działać! Miałem błąd NZEC (nie zerowy exit code).

0

@Silv: Dzięki za pomoc. Zmieniłam wszystkie int'y na unsigned long long int i SPOJ zaakceptował moje rozwiązanie. Dziękuje również za rady dotyczące forum :)

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