» »

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 :)
  • spremenilo: Lad20 ()

rasta ::

Najprej pretvori število v string in nato reformatiraj ta string (ena enostavna zanka).

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.

Zgodovina sprememb…

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 ?

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.

Zgodovina sprememb…

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:
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č!:)

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.

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.

Zgodovina sprememb…

MrBrdo ::

Ja nisem ravno testiral kode, ne rata mi vedno na pamet pravilno naredit :) Mislim da bi moral edino tole spremenit:
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 ::

technolog je izjavil:

P.S: long int je isto kot int. Sinonim.


Popolnoma narobe. Za dva razlicna tipa ne smes nikoli privzeti, da sta enaka. Tole je res samo na 32 bitnih operacijskih sistemih. Pa se to je odvisno od prevajalnika.

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
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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C]Večni problem - C in 64 bitov

Oddelek: Programiranje
5860 (755) Ezekiel
»

Najhitrejši programski jezik? (strani: 1 2 )

Oddelek: Programiranje
757669 (5489) Senitel
»

Pomnilnik in c++

Oddelek: Programiranje
242117 (1826) Gundolf
»

[C++] novi standardi in compilerji

Oddelek: Programiranje
211599 (1192) Ezekiel
»

[C/C++] unsigned long lala = -1;

Oddelek: Programiranje
51150 (1109) Vesoljc

Več podobnih tem