Pascal-ban egy függvényt szeretnék írni, ami a kapott számban felcseréli a számjegyeket. Miként lehet ezt megoldani?
Matematikai műveletekkel kellene megoldani a számjegyek cseréjét és nem string-be konvertálással, "val", "str", "inttostr", "strtoint" eljárásokkal...
Ezeket a fentebbieket szeretném kizárni és csak számolással, matematikai műveletekkel szeretném a cserét megoldani, van erre valamilyen lehetőség?
A kétjegyűt írtam meg, úgy gondoltam azért linkelted be, hogy megértsem a C kódos megoldást is, vagy elgondolkodjak rajta. :-)
Nagyon hasznos ha hozzászólsz a dolgokhoz. :-)
Hát, a linkem alapján aligha érted meg a C-s dolgot, mert az is ugyanazt csinálja, mint a tied, csak basicben. De elgondolkodni attól még lehet...
A programod teljesen jó, de ha csak ennyi a feladat, elhagyhatod a függvényt:
Program szamjegycsere;
var szam : integer;
begin
Write('Kerem a szamot : '); ReadLn(szam);
WriteLn('A felcserelt szam: ', szam mod 10*10 + szam div 10);
ReadLn;
end.
Talán így kicsit érthetőbb, ha nem olvasható másold be az IDE -be. C és C++ nyelven is lefordul.
int Reverse(int x)
{
int szamKaraktereinekSzama = -1; // -1 -el incializáljuk, mert a nulladik hatványra is szükség van
for(int i = x; i != 0; i /= 10, ++szamKaraktereinekSzama)
{
// Tegyük fel x = 123 - mivel int így osztásoknál lefelé lesznek kerekítve
// 123 / 10 = 12,3
// 12 / 10 = 1,2
// 1 / 10 = 0,1 - i egyenlő 0 -val így a ciklus megáll és kideült 3 számjegyes
}
int eredmeny = 0;
for(; x != 0; --szamKaraktereinekSzama)
{
eredmeny += (x % 10) * pow(10, szamKaraktereinekSzama);
x /= 10;
// 123 % 10 = 3 * 100 = 300
// 12 % 10 = 2 * 10 = 20
// 1 % 10 = 1 * 1 = 1
}
return eredmeny;
}
Három vagy többjegyűeknél ez ciklusban működne ahogy a C kósban van és akkor a length változót gondolom úgy kell beállítani, hogy:
10 - 99 intervallum esetén 2
100 - 999 intervallum esetén 3
1000 - 9999 esetén 4
stb?
#6 alapján megpróbáltam pascalból is előgyötörni valami hasonlót. Az az igazság, hogy már túl álmos vagyok ahhoz, hogy értsem is, ezért jó eséllyel belecsúszhatott bármiféle, holnapra vállalhatatlan marhaság. Próbálgatva mindenesetre úgy tűnik, hogy működik. A longint miatt csak maxiumum 9 számjegyen nem kéne hibáznia vagy megdöglenie. A hibás adat ellen nem tesz semmit -- a dolog iróniája, hogy a hibaszűrést szöveges adatbevitellel lehetne megoldani, ami pont értelmetlenné tenné az egész ügyeskedést, mivel a string sokkal lezserebben megfordítható + akármilyen hosszú lehet...
program reverse;
uses math;
var szam : longint;
function Reverse(x : longint) : longint;
var
i : longint;
hossz : integer;
num : extended;
begin
hossz := 0; i := x;
repeat
i := Trunc(i / 10);
Inc(hossz);
until i = 0;
num := 0;
for i:= 0 to hossz-1 do
begin
num := num + (x mod 10) * intpower(10, hossz - i - 1);
x := Trunc(x / 10);
end;
Reverse := Trunc(num);
end;
BEGIN
repeat
WriteLn('Kérem a számot: '); ReadLn(szam);
WriteLn('Forditva: ', Reverse(szam));
WriteLn;
until szam = 0;
END.
tabaki kolléga megoldást picit kiterjesztve pozitív egész számokra 18446744073709551615-ig - csak Free Pascal alatt - és egy egyszerű hibakezelés:
program project1;
uses
SysUtils, Math;
var
szam: QWord;
tovabb : boolean;
function Reverse( x: QWord): QWord;
var
i: QWord;
n : byte;
hossz: byte = 0;
num: extended = 0;
begin
i := x;
repeat
i := i div 10;
Inc(hossz);
until i = 0;
for n := 0 to hossz - 1 do
begin
num := num + (x mod 10) * IntPower(10, hossz - n - 1);
x := x div 10;
end;
Result := Trunc(num);
end;
begin
repeat
try
tovabb := true;
Write(#10#13,'Kérem a számot (1..18446744073709551615, 0: kilép): ');
ReadLn(szam);
except
on e: exception do
begin
WriteLn(#10#13, 'Hiba !');
tovabb := false;
szam := 1;
end;
end;
if tovabb then WriteLn(#10#13, 'Forditva: ', Reverse(szam), #10#13);
until szam = 0;
end.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!