Számjegyek felcserelese

Címkék
Számjegyek felcserelese
2012-12-05T17:54:42+01:00
2012-12-05T21:10:37+01:00
2022-08-07T01:45:30+02:00
Bomeyak
Hello az a kérdesem hogy hogy tudnam egy szam szamjegyeit felcserelni??

Ugyanis az a feladatom hogy ha egy szam elso szamjegye kissebb mint az utolso szamjegye es a szam szamjegyeinek szama paratlan akkor ezek csereljenek helyet ebben a feladatban 2 dolgot nem tudok az elso az hogy mondjuk vannak 5 szamjegyu szamaim es vannak 2 szamjegyu szamaim akkor ezeknek hogy irjam fel az elso szamjegyuket?? a masik pedig a felcsereles

eddig jutottam de tovabb nem tudom

#include <fstream> using namespace std; fstream f("codcorect.in",ios::in); fstream g("codcorect.out",ios::out); int sum,m,n,x[50],i; int nr (int szam){ sum=0; while (szam!=0){m=szam % 10; szam = szam /10; sum += 1;} return sum; } int main() { f>>n; for(i=1;i<=n;i++) f>>x[i]; for(i=1;i<=n;i++) if(x[i]/100<x[i] % 10 && nr(x[i]) % 2!=0){} }
most 100-al tortem de ez csak 3 jegyu szamokra ervenyes hogy tudnam ezt barmilyen szamjegyu szamra felirni???
Mutasd a teljes hozzászólást!
Mert a g<<x[ i]; kiírás nincs a ciklusban, ezért csak egyszer, a ciklus lefutás után az utolsó számra hajtódik végre.

Helyesen:
for(i=1;i<=n;i++) { if(first(x[i])<last(x[i])&& digit_counter(x[i])%2==1) x[i]=swap(x[i]); g<<x[i]; }

Egyébként a tömb teljesen felesleges, hiszen az adatokon csak egyszer kell végigmenni.
Beolvasás-konvertálás-kiírás után többé nem kell elővenni, jöhet a következő.

Ha más egyebet nem kell csinálni, akkor inkább:

int x; ... int main() { f>>n; for(i=1;i<=n;i++) { f>>x; for(i=1;i<=n;i++) { if(first(x)<last(x)&& digit_counter(x)%2==1) x=swap(x); g<<x; } } }
Mutasd a teljes hozzászólást!

  • Használd a tizes alapú logaritmus egész részét. Majd emeld a 10-et a kapott számra. Ezt használd 100 helyett.
    Mutasd a teljes hozzászólást!
  • nos 9.osztalyos diak vagyok es kb 1 honapja tanulok programozni
    mateknel ha jol tudom kesobbi osztalyokba tanuljuk a logaritmust ugyhogy kerlek magyarazd el vagy ird le reszeletesen hogy megertsem
    Mutasd a teljes hozzászólást!
  • Akármilyen alapszintű programozáshoz is ajánlatos ismerni a logaritmus fogalmát, alkalmazási lehetőségeit, akár azon az áron is, hogy előre tanul az ember.

    Az egész feladat nem világos, de az első és utolsó számjegy, továbbá a számjegyek számának meghatározása biztosan kell:
    short first(unsigned long x) { while(x>=10) x /= 10; return x; } short last(unsigned long x) { return x%10; } short digit_counter(unsigned long x) { short counter=1; while(x>=10) { x /= 10; counter++; } return counter; }
    Mutasd a teljes hozzászólást!
  • tehat csak akkor csreljuk ki az elso szamot az utolso szammal ha a szam elso szamjegye kisebb mint az utolso es a szamjegyeinek szama partlan

    ez 10 valo osztas soran erjuk el csak nem tudom mit csinaljak ha a sorozatban van 5 szamjegyu amit mar 10000 kellene osztani hogy megkapjuk az elso szamjegyet
    Mutasd a teljes hozzászólást!
  • tehat pl bemeneti fie:

    4 120 44 23144 1234567

    vesszuk az elso szamot 120 :paratlan szamjegyu de az elso szam nagyobb az utolsonal tehat nem tortenik semmi
    44: szamjegyeinek szama paros tehat nem tortenik semmi
    23144:szamjegyeinek szama paratlan es az elso kisebb mint az utolso tehat valtoztajuk
    1234567:szamjegyeinek szama paratlan es az elso kisebb mint az utolso tehat valtoztajuk

    igy fog kinezni a kimeneti file

    120 44 43142 7234561
    Mutasd a teljes hozzászólást!
  • Kipróbáltad az előbb küldött
    first()
    függvényt?
    Mindegy, hogy hány jegyű a szám.
    Mutasd a teljes hozzászólást!
  • Ez a feladat adja magát, hogy a számokat mint stringeket kezeld.
    A szöveges fájlból csak egyszerűen be kell olvasnod az összefüggő karakterláncokat, mivel két szám között szóköz van.
    Ha egy számot beolvastál, a strlen() függvénnyel megkapod, hogy hány számjegyből áll. Ha ennek a moduló 2-es értéke (strlen()%2) nem nulla, akkor páratlan számjegyből áll.
    A string [0]. eleme az első számjegyed, ASCII kódban, a [strlen()-1]. elem az utolsó számjegyed. Kivonsz belőlük '0'-t (vagy nem is muszáj kivonni) és összehasonlítod, majd felcseréled ha kell.
    Mutasd a teljes hozzászólást!
  • nem szeretnem stingbe csinalni mivel meg nem tanultam

    mas modszer a felcserelesre??
    Mutasd a teljes hozzászólást!
  • Próbáljad ki ezt a függvényt:

    unsigned long swap(unsigned long x) { unsigned long y,z; short a,m=1; for(y=x; y>=10; y/=10) m++; //m= számjegyek száma a=first(x); //első számjegy z=last(x); //utolsó számjegy x/=10; //utolsó számjegy levágva for(z-=a; m>2 ; m--) z*=10; x+=z; x=10*x+a; }
    Mutasd a teljes hozzászólást!
  • kiprobaltam de a felcserelesre nem mondtal semmit
    Mutasd a teljes hozzászólást!

  • Öregem, félévkor is lehet iskolát váltani, én nem késlekednék...

    Ezek a feladatok, amikkel naponta árasztod a prog.hu-t, informatikában körülbelül olyan szintűek, mint mondjuk matekban az összeadás-kivonás.

    Ha már itt elakadsz, akkor nagyon kemény hátralévő életed lesz...
    Főleg, hogy a jelek szerint kitartás se szorult beléd (pedig az nagyon sokat segíthetne)...
    Mutasd a teljes hozzászólást!
  • A kicserélés az imént küldött swap() függvény dolga lesz és ilyesmibe kell becsomagolni:

    if((first(x)<last(x))&&(digit_counter(x)%2==1)) x=swap(x);

    Ellenőrizzed, mert csak egyes részleteket próbáltam ki.
    Mutasd a teljes hozzászólást!
  • nos lehet valahol igazad van de mivel kb 1 honapja vagy 3 hete lattam c++ programot eletemben eloszor ezert szerintem termeszetes hogy ennyit kerdezek
    Mutasd a teljes hozzászólást!
  • en igy irtam ossze de ez nem biztos nem jo


    #include <fstream> using namespace std; fstream f("codcorect.in",ios::in); fstream g("codcorect.out",ios::out); int sum,m,n,x[5000],i; int first(int x) { while(x>=10) x /= 10; return x; } int digit_counter(int x) { int counter=1; while(x>=10) { x /= 10; counter++; } return counter; } int last(int x) { return x%10; } int swap(int x) { int y,z; short a,m=1; for(y=x; y>=10; y/=10) m++; a=first(x); z=last(x); x/=10; for(z-=a; m>2 ; m--) z*=10; x+=z; x=10*x+a; } int main() { f>>n; for(i=1;i<=n;i++) f>>x[i]; for(i=1;i<=n;i++) if(first(x)<last(x)&& digit_counter(x)%2==1) x=swap(x); g<<x[i]; }
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Ezt csak Te tudod tesztelni, készítsél input fájlokat - ahogyan a feladat előírja - és futtasd le őket.


    Hirtelenjében annyi hibát látok, hogy ha lesz egy x[] tömb, akkor mindegyik x helyett x[ i] legyen.
    (A függvényekben lévő lokális x-k maradhatnak.)

    Vagy pedig, (telik az angol abc-ből) az utolsó sorokban:
    y=x[i]; if(first(y)<last(y)&& digit_counter(y)%2==1) z=swap(y); g<<z;
    Mutasd a teljes hozzászólást!
  • ok ez a program erre a bemenetre

    4 120 44 23144 1234567

    ezt adja ki


    7234561

    viszont ezt kellene


    120 44 43142 7234561
    Mutasd a teljes hozzászólást!
  • Mert a g<<x[ i]; kiírás nincs a ciklusban, ezért csak egyszer, a ciklus lefutás után az utolsó számra hajtódik végre.

    Helyesen:
    for(i=1;i<=n;i++) { if(first(x[i])<last(x[i])&& digit_counter(x[i])%2==1) x[i]=swap(x[i]); g<<x[i]; }

    Egyébként a tömb teljesen felesleges, hiszen az adatokon csak egyszer kell végigmenni.
    Beolvasás-konvertálás-kiírás után többé nem kell elővenni, jöhet a következő.

    Ha más egyebet nem kell csinálni, akkor inkább:

    int x; ... int main() { f>>n; for(i=1;i<=n;i++) { f>>x; for(i=1;i<=n;i++) { if(first(x)<last(x)&& digit_counter(x)%2==1) x=swap(x); g<<x; } } }
    Mutasd a teljes hozzászólást!
  • elfogadta de csak miutan a swap fuggvenybe tettem egy return x -et kosz a segitseget
    Mutasd a teljes hozzászólást!
  • Igen, az tényleg lemaradt.


    Egyébként a feladat - csak egy kicsit - de nehezebb, mint aminek látszik, mert pl. a
    500008-ból 800005 helyett könnyen 85-t kaphat, aki nem elég körültekintő.

    A feladatban csak azért van a látszólag önkényes "...ha ... elso szamjegye kissebb mint az utolso szamjegye..." feltétel, hogy a 0-ra végződő számokat kizárják. Ugyanis pl. 3210-ból 213-at kapnánk. A várt 0213 csak úgy jönne ki, hogy ha számok helyett stringeket használnánk, pedig látszik, hogy e példákkal az egyszerű aritmetikai műveleteket szeretnék begyakoroltatni.
    Mutasd a teljes hozzászólást!
Címkék
abcd