Smallest power of 6 whose decimal expansion contains n: Difference between revisions

m
→‎{{header|Pascal}}: changed generating of strings.
(Added Perl)
m (→‎{{header|Pascal}}: changed generating of strings.)
Line 92:
Doing long multiplikation like in primorial task.
<lang pascal>program PotOf6;
{$IFDEF FPC} {$MODE DELPHI} {$ENDIF}
{$MODE DELPHI}
{$OPTIMIZATION ON,ALL}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
sysutils,strutils;
const
// POT_LIMIT = 6260;DEC_LIMIT = 1000000;//'575115' in 6^6260 //22min // ~Limit x10 ~> runtime x 87
// POT_LIMIT = 1736;DEC_LIMIT = 100000;//'83081' in 6^1736 //15.3s
//'83081' in 6^1736 mean power 422.48
// POT_LIMIT = 444;DEC_LIMIT = 10000;//'2565' // 0.19s
// POT_LIMIT = 444; 147;DEC_LIMIT = 100010000;//'120'
//'2565' mean power 135.82 0.157s
// POT_LIMIT = 46;DEC_LIMIT = 100;//'52'
// POT_LIMIT = 147; 28;DEC_LIMIT = 221000;//'14'
//'120' mean power 44.21
// POT_LIMIT = 46; 46;DEC_LIMIT = 100;//'52'
//'52' mean power 15.71
// POT_LIMIT = 44428;DEC_LIMIT = 10000;//'2565' // 0.19s22;
//'14' mean power 9.73
 
type
tMulElem = Uint32;
Line 112 ⟶ 113:
var
Pot_N_str : array of AnsiString;
T0,maxPow,PowerSum,lastpot,SumLenght : INt64;
 
functionprocedure ConvToStr(var s:Ansistring;const Mul:tMul):AnsiString;
const
NineZeros:string[9] ='000000000';
var
s,dummys9: string[9];
i,jpS : integerpChar;
i,j,k : NativeInt;
begin
setlength(result,lengthi := High(MUL)*9);
ij := High(Muli+1)*9;
setlength(PotArrNs,0j+1);
result := IntToStr(Mul[i]);
jpS := lengthpChar(s);
// fill complete with '0'
fillchar(pS[0],j,'0');
str(Mul[i],S9);
j := length(s9);
move(s9[1],pS[0],j);
k := j;
dec(i);
If i >= 0 then
repeat
// result += Formatstr('%.9d',[Mul[i]],S9);// takesno >leading double time'0'
dummyj := NineZeroslength(s9);
s := IntToStrinc(Mul[i]k,9);
//move to the right place, leading '0' is already there
j := length(s);
move(ss9[1],dummypS[9+1k-j],j);
result += dummy;
dec(i);
until i<0;
setlength(Pot_N_strs,0k);
inc(SumLenght,k);
end;
 
Line 149 ⟶ 158:
Begin
prod := n*Mul[j]+Carry;
Carry := prod DIVDiv LongWordDec;
result[j] := Prod - Carry*LongWordDec;
end;
Line 157 ⟶ 166:
Setlength(result,length(Mul));
end;
 
procedure OutS(const s:Ansistring;j:nativeInt);
begin
writeln(s,' ',j);
end;
 
procedure GeneratePot_N_Str(number:NativeInt);
var
PotArrN : array[0..1] of tMul;
i,toggle : NativeInt;
Begin
setlength(Pot_N_str,POT_LIMIT+1);
Pot_N_str[0] := '1';
resultPot_N_str[1] := IntToStr(Mul[i]number);
 
setlength(PotArrN,POT_LIMIT+1);
setlength(PotArrN[0],1);
setlength(PotArrN[1],1);
PotArrN[0,0] := 1;
Pot_N_str[0] := '1';
PotArrN[1,0] := number;
 
Pot_N_str[1] := IntToStr(number);
//create all pot of numbers up to number**POT_LIMIT with clean up in parallel
SumLenght :=0;
i := 2;
toggle := 0;
while i <= POT_LIMIT do
begin
PotArrN[itoggle] := Mul_N(PotArrN[i-1-toggle],number);
ConvToStr(Pot_N_str[i] := ConvToStr(,PotArrN[itoggle]);
toggle := 1-toggle;
setlength(PotArrN[i-1],0);
inc(i);
IF i AND 1023 = 0 then
write(i,#13);
end;
writeln(' used by strings ',Numb2USA(IntToStr(SumLenght)),' bytes');
setlength(PotArrN[i-1],0);
end;
setlength(PotArrN[0],0);
procedure OutT(const s: Ansistring;j:NativeInt);
setlength(PotArrN,0);
Begin
writeln(j:10,maxPow/(j+1):8:2,(maxPow-lastPot)/1024:8:2,(GetTickCount64-T0)/1000:10:3);
T0 := GetTickCount64;
lastpot := maxPow;
end;
var
s:AnsiString ansistring;
i,j,number,maxpos: NativeIntInt32;
found:Boolean;
Begin
number := 6;
T0 := GetTickCount64;
GeneratePot_N_Str(number);
writeln('Generating time to power limit ',(GetTickCount64-T0)/1000:5:3,'s');
 
T0 := GetTickCount64;
//Now check for first occurence str of i
maxposmaxPow := 0;
lastpot := 0;
For i := 0 to DEC_LIMIT-1 do
begin
s := intToStrstr(i,s);
found:= false;
For j := 0 to POT_LIMIT do
Begin
if Pos(s,Pot_N_str[j])>0 then
Begin
foundIF :=maxPow<j true;then
If maxpos<j thenmaxPow := J;
PowerSum maxpos:+= j;
IF POT_Limit > 99 then
write(s:3,number:3,'^',j:5,maxposmaxPow:6,#13)
else
writeln(s:3,number:3,'^',j:2,' ', Pot_N_str[j]);
break;
end;
if Not(Found) then
Begin
Write(s,' Not Found ');
readln;
end;
end;
writeln;
writeln('maxmean potpower :to find string',maxposPowerSum/DEC_LIMIT:8:2);
// clean up strings
For j := POT_LIMIT downto 0 do
setlength(Pot_N_str[j],0);
setlength(Pot_N_str,0);
end.</lang>
{{out}}
<pre>
used by strings 330
 
Generating time to power limit 0.000s
0 6^ 9 10077696
1 6^ 0 1
Line 250 ⟶ 264:
20 6^26 170581728179578208256
21 6^ 3 216
 
max pot :28</pre>
mean power to find string 9.73
 
//Search strings 0 to 99999
used by strings 1,174,099 bytes
Generating time to power limit 0.008s
99999 6^ 1287 1736
mean power to find string 422.48
 
real 0m14,684s
user 0m14,522s</pre>
 
=={{header|Perl}}==
Anonymous user