Composite numbers k with no single digit factors whose factors are all substrings of k: Difference between revisions

Added FreeBASIC
(Add PARI/GP implementation)
(Added FreeBASIC)
 
(One intermediate revision by one other user not shown)
Line 436:
Real: 00:00:26.059
</pre>
 
=={{header|FreeBASIC}}==
{{trans|ALGOL 68}}
<syntaxhighlight lang="vbnet">Function isSubstring(kStr As String, f As Integer) As Integer
Dim As String fStr = Str(f)
Dim As Integer fLen = Len(fStr)
Dim As Integer result = 0
Dim As Integer fEnd = Len(kStr) - fLen + 1
For fPos As Integer = 1 To Len(kStr) - fLen + 1
If Mid(kStr, fPos, fLen) = fStr Then
result = -1
Exit For
End If
Next fPos
Return result
End Function
 
Dim As Integer requiredNumbers = 20
Dim As Integer kCount = 0
For k As Integer = 11 To 99999999 Step 2
If k Mod 3 <> 0 And k Mod 5 <> 0 And k Mod 7 <> 0 Then
Dim As Integer isCandidate = -1
Dim As String kStr = Str(k)
Dim As Integer v = k
Dim As Integer fCount = 0
For f As Integer = 11 To Sqr(k) + 1
If v Mod f = 0 Then
isCandidate = isSubstring(kStr, f)
If isCandidate Then
While v Mod f = 0
fCount += 1
v \= f
Wend
Else
Exit For
End If
End If
Next f
If isCandidate And (fCount > 1 Or (v <> k And v > 1)) Then
If v > 1 Then isCandidate = isSubstring(kStr, v)
If isCandidate Then
Print Using "#######,###"; k;
kCount += 1
If kCount Mod 10 = 0 Then Print
End If
End If
End If
If kCount >= requiredNumbers Then Exit For
Next k</syntaxhighlight>
{{out}}
<pre> 15,317 59,177 83,731 119,911 183,347 192,413 1,819,231 2,111,317 2,237,411 3,129,361
5,526,173 11,610,313 13,436,683 13,731,373 13,737,841 13,831,103 15,813,251 17,692,313 19,173,071 28,118,827</pre>
 
=={{header|Go}}==
Line 694 ⟶ 746:
=={{header|PARI/GP}}==
<syntaxhighlight lang="PARI/GP">
/* Returns a substring of str starting at s with length n */
ssubstr(str, s = 1, n = 0) = {
my(vt = Vecsmall(str), ve, vr, vtn = #str, n1);
if(vtn==0,return(""));
if (s<1||s>vtn == 0, return(str""));
if (s < 1 || s > vtn==0, return(""str));
n1 = vtn - s + 1; if (n == 0, n = n1); if (n > n1, n = n1);
ve = vector(n, z, z - 1 + s); vr = vecextract(vt, ve); return(Strchr(vr));
}
 
/* Checks if subStr is a substring of mainStr */
 
isSubstring(mainStr, subStr) = {
mainLen = #Vecsmall(mainStr);
subLen = #Vecsmall(subStr);
for (startPos = 1, mainLen - subLen + 1,
if (ssubstr(mainStr, startPos, subLen) == subStr,
return return(1); /* True,: subStr found thein substringmainStr */
)
);
return return(0); /* False,: substringsubStr not found */
}
 
\\/* Determines if a number's factors, all > 9, are substrings of its decimal representation */
 
\\ Determines if a number's factors, all > 9, are substrings of its decimal representation
contains_its_prime_factors_all_over_9(n) = {
if (n < 10 || isprime(n), return(0)); \\/* Early returnSkip if n < 10 or n is prime */
strn = Str(n); \\/* Convert n to its string representation*/
pfacs = factor(n)[, 1]; \\/* Get the unique prime factors of n */
\\printfor ("ni =" n "1,pfacs=" #pfacs);,
if (pfacs[i] <= 9, return(0)); /* Skip factors ≤ 9 */
for(i=1, #pfacs,
if (!isSubstring(strn, Str(pfacs[i] <= 9)), return(0)); \\/* Check Skipif factorsfactor notis greatera thansubstring 9*/
if(!isSubstring(strn, Str(pfacs[i])), return(0)); \\ Check if factor is not a substring
);
return(1); \\/* All conditionschecks metpassed */
}
 
\\/* Main loop to find and print numbers meeting the criteria */
{
found = 0; \\/* InitializeCounter counterfor numbers found */
for (n = 0, 30 * 10^6, \\/* Iterate from 0 to 30 million */
if (contains_its_prime_factors_all_over_9(n),
found += 1; \\/* Increment counter if n meets the criteria */
print1(n, " "); \\/* Print n followed by a space */
if (found % 10 == 0, print("")); \\/* Print a newlineNewline every 10 numbers */
if (found == 20, break); \\/* Stop after finding 20 numbers */
);
);
2,122

edits