Skocz do zawartości

  •  
  • Mini kompendium
  • MimeTeX
  • Regulamin

Zdjęcie

funkcja odwracająca kolejność cyfr w C++


  • Nie możesz napisać tematu
  • Zaloguj się aby odpowiedzieć
8 odpowiedzi w tym temacie

#1 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 30.09.2010 - 22:32

Mam napisać funkcję w C++, która dla danej liczby całkowitej nieujemnej n zwraca liczbę będącą "lustrzanym odbiciem" liczby n, tzn taką, która ma te same cyfry co liczba n, ale w odwrotnej kolejności. Np dla n=234 funkcja powinna zwrócić liczbę 432, a dla n=50 liczbę 5.
Napisałem coś takiego:

int reverse (int n)
{
    int LiczbaCyfr = floor( log10(n)+1);
    int k = 0;
    for( int i=0; i<LiczbaCyfr; i++)
    {
             k+=pow(10, LiczbaCyfr - 1 - i )*(n%10);
             n=n/10;
    }
    return k;
}

Moje pytanie brzmi: dlaczego czasem wynik jest poprawny a czasem o 1 mniejszy niż powinien być. Teoretycznie jak zmieniłem typ zmiennej k na double zamiast int to już działało, ale nadal nie wiem czemu z int czasami nie działało :P
  • 0

Afroman

    Kombinator

  • Użytkownik
3
  • Płeć:Kobieta

Napisano 25.09.2011 - 17:55

#2 Tomalla

Tomalla

    =-.-= Spatter Guy =-.-=

  • $Jr Admin
  • Redaktor
  • 3211 postów
1037
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 01.10.2010 - 16:33

Mam napisać funkcję w C++, która dla danej liczby całkowitej nieujemnej n zwraca liczbę będącą "lustrzanym odbiciem" liczby n, tzn taką, która ma te same cyfry co liczba n, ale w odwrotnej kolejności. Np dla n=234 funkcja powinna zwrócić liczbę 432, a dla n=50 liczbę 5.
Napisałem coś takiego:

int reverse (int n)
{
    int LiczbaCyfr = floor( log10(n)+1);
    int k = 0;
    for( int i=0; i<LiczbaCyfr; i++)
    {
 			k+=pow(10, LiczbaCyfr - 1 - i )*(n%10);
 			n=n/10;
    }
    return k;
}

Moje pytanie brzmi: dlaczego czasem wynik jest poprawny a czasem o 1 mniejszy niż powinien być. Teoretycznie jak zmieniłem typ zmiennej k na double zamiast int to już działało, ale nadal nie wiem czemu z int czasami nie działało :P



1. Z jakiego kompilatora korzystasz?
2. Czy masz jakieś inne "ciekawe" informacje w logu?
3. Daj przykłady liczb dla których wychodzi ci zły wynik.


Na razie zastąp tą linijkę:

k+=pow(10, LiczbaCyfr - 1 - i )*(n%10);

... taką:

k+=pow(10.0, LiczbaCyfr - 1 - i )*(n%10);

... i powiedz czy zadziałało. Jak nie, odpowiedz mi na poprzednie trzy punkty :P Problem leży bezpośrednio po stronie funkcji, a konkretnie ich nagłówków. Pozdrawiam
  • 0
________
Nie rozwiązuję zadań poprzez PMy!
Nie zaśmiecać mi skrzynki odbiorczej wiadomościami typu "pomóż mi w następnym zadaniu" etc.
Tego typu wiadomości będę po prostu ignorował i od razu usuwał.


=-.-= ToMaLlA - General Modder in games with QuaKe 3 and DooM III EnGiNes =-.-=

#3 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 01.10.2010 - 17:43

1. Z jakiego kompilatora korzystasz?
2. Czy masz jakieś inne "ciekawe" informacje w logu?
3. Daj przykłady liczb dla których wychodzi ci zły wynik.

Nie zadziałało niestety, dalej np dla liczb 543 i 234 zwraca mi wartość o 1 za małą.
Korzystam z Dev-C++, ale jakby coś to mam też Visual C++ tylko nie umiem jeszcze z niego korzystać :P
W logu mam dwa ostrzeżenia "[Warning] converting to `int' from `double' ".
Jeśli jeszcze mógłbyś mi bardziej łopatologicznie wyjaśnić istotę tego problemu to będę wdzięczny, w końcu inaczej się nie nauczę :)
  • 0

#4 Tomalla

Tomalla

    =-.-= Spatter Guy =-.-=

  • $Jr Admin
  • Redaktor
  • 3211 postów
1037
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 01.10.2010 - 18:02

Bardzo dziwne że ci żadnych błędów nie wywala, tylko ostrzeżenia. Spróbowałem to skompilować w Devie i nie mogę gdyż jest błąd w linijce gdzie wywołujesz funkcję pow:

call of overloaded `pow(int, int)' is ambiguous

Znaczy to mniej więcej tyle, że nie ma przeciążonej wersji tej funkcji, która ma dwa inty jako argumenty - a takie właśnie podajesz. Gdyby zastosowali szablony zamiast dawać po kilkanaście przeciążonych funkcji, to nie byłoby tego problemu, no ale cóż :P Dlatego też zamieniłem 10 na 10.0, która jest już zmiennoprzecinkowa i wszystko idzie dalej. A liczby które podałeś są "odwracane" u mnie poprawnie, więc sam nie wiem. Podaj kod całego twojego programu bo aż mi się nie chce wierzyć że wychodzi nam zupełnie co innego z takim samym kodem.

Napisałeś, że po zmianie typu zmiennej n z int na double wszystko działało. Właśnie dlatego podejrzewam że sprawcą są te przeciążone funkcje. Ale może się mylę, nie wiem. Podaj ten kod to się jeszcze upewnię.
  • 0
________
Nie rozwiązuję zadań poprzez PMy!
Nie zaśmiecać mi skrzynki odbiorczej wiadomościami typu "pomóż mi w następnym zadaniu" etc.
Tego typu wiadomości będę po prostu ignorował i od razu usuwał.


=-.-= ToMaLlA - General Modder in games with QuaKe 3 and DooM III EnGiNes =-.-=

#5 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 01.10.2010 - 18:39

W całości to tak wygląda:
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int reverse (int n);
int main()
{
    int n;
    cout << "Podaj liczbe całkowita nieujemna: " << endl;
    cin >> n;
    cout << "Odwrocona liczba to: "<< reverse(n);
    getch();
    return 0;
}
int reverse (int n)
{
    int LiczbaCyfr = floor( log10(n)+1);
    int k = 0;
    for( int i=0; i<LiczbaCyfr; i++)
    {
             k+=pow(10.0, LiczbaCyfr - 1 - i )*(n%10);
             n=n/10;
    }
    return k;
}

Po zmianie na double, nie wiem czy działa wszystko, bo tylko kilka sprawdziłem, ale działały te, które nie działały jak k było int :)
Jakby coś to ja mam wersje Dev'a 4.9.9.2.
  • 0

#6 Tomalla

Tomalla

    =-.-= Spatter Guy =-.-=

  • $Jr Admin
  • Redaktor
  • 3211 postów
1037
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 01.10.2010 - 18:56

Widzę że używasz nagłówka math.h Problem jest w tym, że jest on charakterystyczny dla języka C - nie oznacza to oczywiście, że nie jest kompatybilna z C++, jednakże C++ ma własną, uaktualnioną bibliotekę funkcji mat. pod nagłówkiem cmath. Spróbuj podmienić więc tą linijkę:

#include<math.h>

... na:

#include<cmath>

Sprawdziłem twój kod - i rzeczywiście po wprowadzeniu liczb które podałeś, program zwraca błędne wartości. I ... nie ma błędów kompilacji, tylko ostrzeżenia. Tak więc mamy winowajcę.

Dobrym nawykiem jest nie mieszanie C i C++, w każdym razie nie w takich prostych programach ;) Nagłówek conio.h także jest reliktem z C - na twoim miejscu skasowałbym ten nagłówek i zamiast funkcji:

getch();

... dał:

cout << "\n\n";
system("PAUSE");

Zapewniam cię, że wtedy nie będzie już żadnych wątpliwości co do działania programu. Pozdrawiam ;)
  • 1
________
Nie rozwiązuję zadań poprzez PMy!
Nie zaśmiecać mi skrzynki odbiorczej wiadomościami typu "pomóż mi w następnym zadaniu" etc.
Tego typu wiadomości będę po prostu ignorował i od razu usuwał.


=-.-= ToMaLlA - General Modder in games with QuaKe 3 and DooM III EnGiNes =-.-=

#7 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 01.10.2010 - 19:29

O, faktycznie działa, dzięki :) ja jeszcze jestem na takim etapie, że się nie orientuje za bardzo ani w tych bibliotekach ani w pożytecznych programistycznych zwyczajach, także za wszelkie wskazówki i informacje jestem wdzięczny :)
  • 0

#8 Xornogard

Xornogard

    Nowicjusz

  • Jr Użytkownik
  • 1 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 24.10.2015 - 22:02

Witam,

 

Z góry przepraszam za odkopanie starego tematu, ale próbując rozgryźć algorytm odwracania liczby znalazłem się na tym forum.

Okazało się, że miałem dokładnie taki sam pomysł, więc wziąłem się do przekształcenia go w kod. Szybko znalazłem odpowiedź dlaczego gdy wpisywało się liczbę np. 501 to funkcja zwracała nam 104.

 

Jeszcze do końca nie odkryłem dlaczego, ale metoda pow() w tym przypadku powodowała, że zamiast dodać do obiektu k wartość 100, to dodawała wartość 99.

 

rozwiązaniem tego problemu było do metody pow dodać metodę floor() i wyniki już się zgadzają :)

 

oto prawidłowo działająca funkcja:

int odwroc_liczbe(int liczba)
{
    int liczba_cyfr = floor(log10(liczba)+1);
    int wynik=0;

    for(int i=1; i<=liczba_cyfr; i++)
    {
        wynik += floor(pow(10,liczba_cyfr-i))* (liczba%10);

        liczba /=10;
    }

    return wynik;
}

jeszcze raz przepraszam za odkopanie tematu, ale może się przydać tym, którzy tak jak ja znajdą ten temat w google'ach :)

 

Pozdrawiam


  • 1

#9 Mariusz M

Mariusz M

    Wielki Analityk

  • Użytkownik
  • Redaktor
  • 901 postów
414
Instruktor II
  • Płeć:Mężczyzna

Napisano 28.10.2015 - 11:01

Up pamiętasz algorytm zamiany zapisu liczby z jednego systemu pozycyjnego na inny
Tutaj można by skorzystać z tego samego pomysłu a odwróconą liczbę zapisywać w łańcuchu


  • 0