• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z funkcją matematyczną C++

Object Storage Arubacloud
0 głosów
917 wizyt
pytanie zadane 21 sierpnia 2017 w C i C++ przez seba Dyskutant (8,900 p.)

Witam otóż pisze sb program zamieniający liczbe np 123 na 321 i mam mały problem.


    for(int i=0;i<ilosc_cyfr;i++)
    {
        wynik1+=(tab_liczb[i]*pow(10,schowek2-=1));

    }
cout<<wynik1;
//wynik1 na starcie =0
//tab_liczb to podzielona na części liczba 123 np tab_liczb[0]=3,tab_liczb[1]=2,tab_liczb[2]=1;
//schowek2 przechowuje wartość "ilosc_cyfr" np 123 to ilosc_cyfr(czyli tez schowek) jest równy 3
i tak leci że 3*10^2 += 3*10^1 += 3*10^0 

 

Wszystko działa tak że wpisuje np liczbe 12 to wyskoczy mi 21, liczbe 1234 to wyskoczy 4321 ale gdy wpisze np 123 to dostaje 320 albo liczbe 422 to dostaje 223. Tak jakby czasem nie dodawał jedynki. Zbytnio nwm co mam źle a siedzę już nad tym dość długo.

Za problemy z rozgryzieniem o co mi chodzi serdecznie przepraszam.

1
komentarz 21 sierpnia 2017 przez vector Dyskutant (9,200 p.)

a nie prościej zrobić tego tak ?

#include <bits/stdc++.h>

int fn(int x) {
	std::string str = std::to_string(x);
	std::reverse(str.begin(), str.end());
	return std::stoi(str);
}

int main(void) {
	std::cout << fn(100) << std::endl;
	std::cout << fn(123) << std::endl;
	return 0;
}

 

komentarz 21 sierpnia 2017 przez seba Dyskutant (8,900 p.)

może i prościej ale nie znałem funkcji reverse() ani to to_string() wink

1
komentarz 21 sierpnia 2017 przez k222 Nałogowiec (30,150 p.)
edycja 21 sierpnia 2017 przez k222

a mógłbyś wrzucić cały kod, żeby można było go odpalić i popróbować?

 

bo w tym momencie ciężko stwierdzić po jednej funkcji (która powinna działać) + nie rozumiem fragmentu:

//showek2 przechowuje wartość "ilosc_cyfr" np 123 to ilosc_cyfr(czyli tez schowek) jest równy 3

skoro to to samo to po co dwie zmienne zamiast jednej?

 

oraz możesz spróbować zrobić to samo na stringach, po prostu potraktuj string jako tablicę i w 4 linijkach możesz zamknąć problem (bez reverse oraz to_string)

komentarz 21 sierpnia 2017 przez seba Dyskutant (8,900 p.)
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
int liczba;

   cin>>liczba;

   int schowek;
   int ilosc_cyfr=1;
   schowek=liczba;
//-------------------tworzenie tablicy------------
   for(;;)
    {
        if(schowek/10>0){
                schowek=schowek/10;
                ilosc_cyfr++;
        }
        else break;
    }

    int *tab_liczb=new int[ilosc_cyfr];
//------------------------------------------------

//------------------wpisanie do tablicy pojedynczych cyfr------------
    schowek=liczba;
    for(int i=0;i<ilosc_cyfr;i++)
    {
        tab_liczb[i]=schowek%10;
        schowek/=10;
    }
//------------------------------------------------

    schowek=liczba;
    int schowek2=ilosc_cyfr;
    int wynik1=0,wynik2=0;

    for(int i=0;i<ilosc_cyfr;i++)
    {
        wynik1+=(tab_liczb[i]*pow(10,schowek2-=1));

    }
	cout<<wynik1;
return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 21 sierpnia 2017 przez 10kw10 Pasjonat (22,880 p.)
wybrane 21 sierpnia 2017 przez seba
 
Najlepsza

Każdy egzemplarz funkcji pow() zwraca typ zmiennoprzecinkowy (http://en.cppreference.com/w/cpp/numeric/math/pow). Ta funkcja ma pewną ułomność - nie jest w 100% dokładna. Dla np. pow(5, 3) zobaczysz wynik 124, gdyż wypisałeś tą liczbę jako całkowitą. Funkcja pow zwróciła w rzeczywistości liczbę 124.(9).

U Cb 3*10^2 to 299 jako int.

Lepiej to zrobic, tak jak juz inni wspomnieli, zamieniajac na stringa lub od razu zapisujac do striga.

 

Mozesz jeszcze sprobowac zaokraglic wynik w gore tak:

wynik1 += (tab_liczb[i] * ceil(pow(10, schowek2 -= 1)));

 

 

0 głosów
odpowiedź 21 sierpnia 2017 przez manjaro Nałogowiec (37,390 p.)

Najprościej nie znając funkcji reverse po prostu w pętli przepisać znak po znaku od końca.

#include <iostream>
using namespace std;

int main () {
    int liczba;
    cin >> liczba;
    string napis = to_string(liczba);

    for(int i=0; i<napis.length(); i++) {
            cout << napis.substr(napis.length()-1-i,1);
        }

    return(0);
}

 

komentarz 21 sierpnia 2017 przez unknown Nałogowiec (39,560 p.)

Najprościej nie znając funkcji reverse

Przeczytać jej opis i przeanalizować przykład: http://en.cppreference.com/w/cpp/algorithm/reverse 

I już się ją "zna"

komentarz 21 sierpnia 2017 przez manjaro Nałogowiec (37,390 p.)
Ale jak ktoś nie wie w ogóle że taka funkcja istnieje.

Podobne pytania

+1 głos
1 odpowiedź 276 wizyt
0 głosów
0 odpowiedzi 503 wizyt
pytanie zadane 5 listopada 2021 w Algorytmy przez Beginner555 Obywatel (1,760 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...