Forum » Programiranje » C++ presledek med števili
C++ presledek med števili
Lad20 ::
Zdravo!
Muči me en problem pri c++. Število, ki ga vpišem bi rad potem izpisal s presledki. Primer:
Vnos: 1234567
Izpis:1 234 567
Vrednosti zapisujem v spremenljivko tipa int. Vem da obstaja nekaj načinov s string opcijo, vendar me zanima če obstaja kaka funkcija ali pa način, da se to reši če imam int. Edina rešitev, ki mi je padla na pamet in ki sem jo tudi preizkusil, je da sem vpisano število razdelil na tisočice...vendar za to potrebujem zelo veliko IF stavkov(za primerjavo kako veliko je število, v katerem rangu-tisočice,stotisočice,...miljarda...), poleg tega pa je tudi dosti problemov s tem načinom... Če vpišem recimo 1085, mi potem moj način vrne 1 85. Torej 0 izgine. Napisal pa sem tako, da recimo najprej izpišem tisočice, vmes dam presledek, ter potem izpišem še ostanek...Problem je rešljiv, tako da poleg presledka dodam 0(najprej preverim z IF-om, če je ostanek manjši 100), vendar je zelo veliko različnih vrednosti, ter mogočih pomanjkljivosti....tako da bi prosil za pomoč, če kdo ve kak drug način.
hvala, lp:)
edit: uporabljam long int, in ne int :)
Muči me en problem pri c++. Število, ki ga vpišem bi rad potem izpisal s presledki. Primer:
Vnos: 1234567
Izpis:1 234 567
Vrednosti zapisujem v spremenljivko tipa int. Vem da obstaja nekaj načinov s string opcijo, vendar me zanima če obstaja kaka funkcija ali pa način, da se to reši če imam int. Edina rešitev, ki mi je padla na pamet in ki sem jo tudi preizkusil, je da sem vpisano število razdelil na tisočice...vendar za to potrebujem zelo veliko IF stavkov(za primerjavo kako veliko je število, v katerem rangu-tisočice,stotisočice,...miljarda...), poleg tega pa je tudi dosti problemov s tem načinom... Če vpišem recimo 1085, mi potem moj način vrne 1 85. Torej 0 izgine. Napisal pa sem tako, da recimo najprej izpišem tisočice, vmes dam presledek, ter potem izpišem še ostanek...Problem je rešljiv, tako da poleg presledka dodam 0(najprej preverim z IF-om, če je ostanek manjši 100), vendar je zelo veliko različnih vrednosti, ter mogočih pomanjkljivosti....tako da bi prosil za pomoč, če kdo ve kak drug način.
hvala, lp:)
edit: uporabljam long int, in ne int :)
- spremenilo: Lad20 ()
technolog ::
Tisto k si napisal da rabiš veliko if stavkov, te stvke se da združit v for zanko. Razmisli.
P.S: long int je isto kot int. Sinonim.
P.S: long int je isto kot int. Sinonim.
Zgodovina sprememb…
- spremenil: technolog ()
Lad20 ::
@rasta: Če drugače ne bo šlo, bom poizkušal na ta način...
@technolog: Sem ugotovil da je int=long int :) Mislil sem, da long int podpira večji razpon števil, vendar imata enake dosege:) Am...Kako si mislil, da bi združil IF-e v for ?
@technolog: Sem ugotovil da je int=long int :) Mislil sem, da long int podpira večji razpon števil, vendar imata enake dosege:) Am...Kako si mislil, da bi združil IF-e v for ?
Zgodovina sprememb…
- spremenilo: Lad20 ()
MrBrdo ::
int x = 1234567; int i = 0; unsigned char out[50]; while (x > 0) { out[i++] = x % 10; x = x / 10; } for (int j = 1; j <= i; j++) { cout << (int) out[i - j]; if (j % 3 == 0) cout << " "; } cout << endl;
če že nočeš itoa uporabit.
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
technolog ::
MrBrdo, malo neefektivna je tale tvoja koda. Meni se ne da zdele pisat, ampak v grobem gre takole:
1. z desetiškim logaritmom določi dolžino števila (recimo ji N)
2. ugotovi največjo "tisočico" int naj=N/3;
3. alociraj pomnilnik te dolžine naj+N (oz +1 če C string)
4. loopaj in manjšaj največjo tisočico dokler ni 0.
p.s.: Seveda je tudi pomembna razlika a hočeš to samo izpisat ali shranit v string.
1. z desetiškim logaritmom določi dolžino števila (recimo ji N)
2. ugotovi največjo "tisočico" int naj=N/3;
3. alociraj pomnilnik te dolžine naj+N (oz +1 če C string)
4. loopaj in manjšaj največjo tisočico dokler ni 0.
p.s.: Seveda je tudi pomembna razlika a hočeš to samo izpisat ali shranit v string.
Zgodovina sprememb…
- spremenil: technolog ()
Lad20 ::
@MrBrdo: Hvala za pomoč, čeprav ta koda ne deluje čisto tako kot bi si želel...Izpiše 123 456 7, rabim pa da bi 1 234 567. Verjetno je treba nekje kaj malega spremeniti, vendar sam nisem še tak expert in ne razumem dobro te kode oziroma kako ta algoritem deluje.. Sam poizkušam programirati na čim lažji način, brez zapletenih algoritmov, ker še nisem tako vešč programiranja kot ti :) Sicer pa sem ugotovil, da mi ni treba uporabiti toliko IF-ov, kot sem mislil na začetku...
Tako nekako izgleda moj način:
Izpis je pa takole:
Problem je če je število recimo 100 000, potem bi mi izpisalo samo 100. Ali pa če je število 1 023, potem bi mi izpisalo samo 1 23. Tako, da mislim, da bo potrebno par IF-ov....pa še to nvm če bo rešilo vse težave:) Drugače pa bom na koncu poizkusil s stringom..
Tako nekako izgleda moj način:
if(a>999&&a<1000000) ta=a/1000; //tisočice števila osta=a%1000; //ostanek...
Izpis je pa takole:
cout<<ta<<" "<<osta<<endl;
Problem je če je število recimo 100 000, potem bi mi izpisalo samo 100. Ali pa če je število 1 023, potem bi mi izpisalo samo 1 23. Tako, da mislim, da bo potrebno par IF-ov....pa še to nvm če bo rešilo vse težave:) Drugače pa bom na koncu poizkusil s stringom..
Zgodovina sprememb…
- spremenilo: Lad20 ()
technolog ::
Saj sem ti povedal, namesto da maš pet ifov, kjer maš pogoje najprej tisoč, potem miljon, potem miljarda, naredi tako da greš z zanko, pogoje pa množiš s 1000. Ti je MrBrdo nakazal kako to gre.
MrBrdo ::
#include <math.h> int x = 1234567; int N = (int) log10(x) + 1; int i = (int) pow(10, N); // int len = N + N / 3; while (N > 0) { cout << (int) (x / i); if (N-- % 3 == 1 && N > 1) cout << " "; x %= i; i /= 10; }
Pa dej že pozabi na "tvojo rešitev", ker je zanič. Nauči se uporabljat zanke.
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
Lad20 ::
@MrBrdo: Tvoje rešitve ne razumem čisto:/ Se mi zdi kar zapletena koda, ki je sam ne bi nikoli spravil skupaj:) Če boš še kaj pomagal, bi prosil kratko obrazložitev kode zraven:) Da bom razumel kodo, ker se mi ne gre samo za to, da imam narejeno nalogo, ampak tudi zato, da jo razumem.
Koda, ki si jo napisal izpiše tole:
x=1234567, izpiše pa 0 123 459
hvala za pomoč!:)
Koda, ki si jo napisal izpiše tole:
x=1234567, izpiše pa 0 123 459
hvala za pomoč!:)
Spura ::
Najbrz operacija logaritma stane vec kot vse ostalo in sploh ni potrebna.
Najlazje je celo stevilo dat v string in potem s stringom delat.
Najlazje je celo stevilo dat v string in potem s stringom delat.
technolog ::
To ti misliš. Logaritem je zelo hiter, kovergira zelo hitro. Sploh pa se da ta logaritem zamenjat z eno zanko, ki deli z 10 dokler ni rezulat nič in prešteje korake. Ravno tako se da naredit za potenco števila 10, da ni treba pretvarjat intov v double. MrBrdova 2 rešitev je skoraj optimalna.
Za razliko pa premikanje charov po stringu ni hitro, če vstaviš znak na prvo mesto, je treba vse naslednje znake prestavit. Tvoj način reševanja ima kompleksnost O(N^2), medtem ko ima MrBrdov samo O(N).
@Lad20: Naskočil si medveda. Če veš kaj to pomeni - problemu, ki mu nisi kos. Posveti se lažjim problemom, z izkušnjami ti bo tak način razmišljanja prišel v podzavest.
Za razliko pa premikanje charov po stringu ni hitro, če vstaviš znak na prvo mesto, je treba vse naslednje znake prestavit. Tvoj način reševanja ima kompleksnost O(N^2), medtem ko ima MrBrdov samo O(N).
@Lad20: Naskočil si medveda. Če veš kaj to pomeni - problemu, ki mu nisi kos. Posveti se lažjim problemom, z izkušnjami ti bo tak način razmišljanja prišel v podzavest.
Zgodovina sprememb…
- spremenil: technolog ()
MrBrdo ::
Ja nisem ravno testiral kode, ne rata mi vedno na pamet pravilno naredit Mislim da bi moral edino tole spremenit:
Drugače pa ima technolog prav...
Spura: Se nebi strinjal ampak če te moti logaritem lahko pač nastaviš N = 10 in potem preskočiš vse nule na začetku... Za int bi moralo bit dovolj.
int i = (int) pow(10, N - 1);
Drugače pa ima technolog prav...
Spura: Se nebi strinjal ampak če te moti logaritem lahko pač nastaviš N = 10 in potem preskočiš vse nule na začetku... Za int bi moralo bit dovolj.
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
BigWhale ::
WarpedGone ::
Tole je res samo na 32 bitnih operacijskih sistemih. Pa se to je odvisno od prevajalnika.
Precej bolj kot od bitnosti je odvisno od prevajalnika.
Zbogom in hvala za vse ribe
BigWhale ::
Vsekakor ampak cez palec lahko reces, da je na 16 bitnih sistemih int 16 biten in long 32 biten, na 32 bitnih sistemih je oboje enako, na 64 bitnih je pa int 32, long in long long pa 64 ...
WarpedGone ::
Sistemih? Verjetno mislš kompajlerih, ki targetirajo nek nabor sistemov. Lastnosti teh sistemov so pa spet zdefinirane z lastnostmi uporabljenih kompajlerjev.
Pod črto se lahk zaneseš samo na tvojo
In še: Tipa ne sodi po imenu, RTFM.
Pod črto se lahk zaneseš samo na tvojo
Za dva razlicna tipa ne smes nikoli privzeti, da sta enaka.
In še: Tipa ne sodi po imenu, RTFM.
Zbogom in hvala za vse ribe
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C]Večni problem - C in 64 bitovOddelek: Programiranje | 872 (767) | Ezekiel |
» | Najhitrejši programski jezik? (strani: 1 2 )Oddelek: Programiranje | 7712 (5532) | Senitel |
» | Pomnilnik in c++Oddelek: Programiranje | 2145 (1854) | Gundolf |
» | [C++] novi standardi in compilerjiOddelek: Programiranje | 1608 (1201) | Ezekiel |
» | [C/C++] unsigned long lala = -1;Oddelek: Programiranje | 1165 (1124) | Vesoljc |