Largest int from concatenated ints: Difference between revisions

Line 726:
# icsort [54;546;548;60];;
- : string = "6054854654"
</pre>
 
=={{header|Pascal}}==
tested with freepascal.
Using only integers.First I thought extending by 9 was the right way.
But extending by the highest digit leads to the correct result.
 
<lang>const
base = 10;// must be integer > 1
source1 : array[0..7] of integer = (1, 34, 3, 98, 9, 76, 45, 4);
source2 : array[0..3] of integer = (54, 546, 548, 60);
 
type
tdata = record
datOrg, // original
datMod : LongWord; // extended by datHighestDigit
datOrgDigitCnt,
datHighestDigit : Word;
end;
tArrData = array of tData;
 
procedure ZiffCount(var n: tdata);
begin
with n do
begin
IF datOrg in[0..base-1] then
Begin
datOrgDigitCnt := 1;
datHighestDigit := datOrg;
end
Else
begin
datOrgDigitCnt := trunc(ln(datOrg)/ln(base)+1);
datHighestDigit := datOrg div trunc(exp((datOrgDigitCnt-1)*ln(base))) ;
end;
end;
end;
 
procedure InsertData(var n: tdata;data:LongWord);
begin
n.datOrg := data;
ZiffCount(n);
end;
 
function FindMaxLen(const ArrData:tArrData): LongWord;
var
cnt : longInt;
res,t : LongWord;
begin
res := 0;// 1 is minimum
for cnt := High(ArrData) downto Low(ArrData) do
begin
t := ArrData[cnt].datOrgDigitCnt;
IF res < t then
res := t;
end;
FindMaxLen := res;
end;
 
procedure ExtendCount(var ArrData:tArrData;newLen: integer);
var
cnt,
i : integer;
begin
For cnt := High(ArrData) downto Low(ArrData) do
with ArrData[cnt] do
begin
datMod := datOrg;
i := newlen-datOrgDigitCnt;
while i > 0 do
begin
datMod := datMod *Base+datHighestDigit;
dec(i);
end;
end;
end;
 
procedure SortArrData(var ArrData:tArrData);
var
i,
j,idx : integer;
tmpData : tData;
begin
For i := High(ArrData) downto Low(ArrData)+1 do
begin
idx := i;
j := i-1;
For j := j downto Low(ArrData) do
IF ArrData[idx].datMod < ArrData[j].datMod then
idx := j;
IF idx <> i then
begin
tmpData := ArrData[idx];
ArrData[idx]:= ArrData[i];
ArrData[i] := tmpData;
end;
end;
end;
 
procedure ArrDataOutput(const ArrData:tArrData);
var
i : integer;
begin
For i := High(ArrData) downto Low(ArrData) do
write(ArrData[i].DatOrg);
writeln;
{ for debug purposes
For i := High(ArrData) downto Low(ArrData) do
with ArrData[i] do
writeln(DatMod,' ',DatOrg,' ',datHighestDigit);
}
end;
 
procedure HighestInt(var ArrData:tArrData);
begin
ExtendCount(ArrData,FindMaxLen(ArrData));
SortArrData(ArrData);
ArrDataOutput(ArrData);
end;
 
var
i : integer;
tmpData : tArrData;
begin
// Source1
setlength(tmpData,length(source1));
For i := low(tmpData) to high(tmpData) do
InsertData(tmpData[i],source1[i]);
HighestInt(tmpData);
// Source2
setlength(tmpData,length(source2));
For i := low(tmpData) to high(tmpData) do
InsertData(tmpData[i],source2[i]);
HighestInt(tmpData);
end.</lang>
output
<pre>998764543431
6054854654
</pre>
 
Anonymous user