Largest int from concatenated ints: Difference between revisions

({{out}})
Line 730:
 
=={{header|Pascal}}==
tested with freepascal.Used a more extreme example 2.
===algorithm 3===
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 pascal>const
base = 10;// must be integer > 1
MaxDigitCnt = 11;
source1 : array[0..7] of integer = (1, 34, 3, 98, 9, 76, 45, 4);
source2 : array[0..3] of integer = (5460, 54654, 548545454546, 600);
 
type
tdata = record
datOrg, // original
datMod : LongWord; // extended by datHighestDigit
datOrgDigitCnt,
datHighestDigit : Word;
datStrOrg : string[MaxDigitCnt];
end;
tArrData = array of tData;
 
procedure ZiffCountDigitCount(var n: tdata);
begin
with n do
begin
//InttoStr is very fast
IF datOrg in[0..base-1] then
str(datOrg,datStrOrg);
Begin
datOrgDigitCnt := 1length(datStrOrg);
end;
datHighestDigit := datOrg;
end
Else
begin
datOrgDigitCnt := trunc(ln(datOrg)/ln(base)+1);
datHighestDigit := datOrg div trunc(exp((datOrgDigitCnt-1)*ln(base))) ;
end;
end;
end;
 
Line 768 ⟶ 761:
begin
n.datOrg := data;
ZiffCountDigitCount(n);
end;
 
Line 786 ⟶ 779:
end;
 
procedure ExtendCountExtendData(var ArrData:tArrData;newLen: integer);
var
cnt,
i,k : integer;
begin
For cnt := High(ArrData) downto Low(ArrData) do
Line 796 ⟶ 789:
datMod := datOrg;
i := newlen-datOrgDigitCnt;
k := 1;
while i > 0 do
begin
datMod := datMod *Base+datHighestDigitOrd(datStrOrg[k])-Ord('0');
inc(k);
IF k >datOrgDigitCnt then
k := 1;
dec(i);
end;
Line 828 ⟶ 825:
procedure ArrDataOutput(const ArrData:tArrData);
var
i,l : integer;
s : string;
begin
{ the easy way
For i := High(ArrData) downto Low(ArrData) do
write(ArrData[i].DatOrgdatStrOrg);
writeln;
*}
{ for debug purposes
l := end0;
For i := High(ArrData) downto Low(ArrData) do
with inc(l,ArrData[i] do.datOrgDigitCnt);
setlength(s,l);
writeln(DatMod,' ',DatOrg,' ',datHighestDigit);
l:= 1;
}
For i := High(ArrData) downto Low(ArrData) do
with ArrData[i] do
Beginbegin
move(datStrOrg[1],s[l],datOrgDigitCnt);
inc(l,datOrgDigitCnt);
end;
writeln(s);
end;
 
procedure HighestInt(var ArrData:tArrData);
begin
ExtendCountExtendData(ArrData,FindMaxLen(ArrData));
SortArrData(ArrData);
ArrDataOutput(ArrData);
Line 864 ⟶ 871:
{{out}}
<pre>998764543431
60545454546540</pre>
6054854654
</pre>
 
=={{header|PARI/GP}}==
Anonymous user