Basicprogramming(.org) > Code and examples
Multiplication with all decimal digits
Galileo:
Simple and fast.
--- Code: ---// Display all multiplications of two numbers such that, between the multiplicants and the result are represented once and only once each digit in the decimal system.
// Developed in Yabasic by Galileo, 01/2019
for a = 1 to 99
for b = 1 to 9999
a$ = str$(a)
b$ = str$(b)
c$ = str$(a * b, "%1.0f")
x$ = a$ + b$
lx = len(x$)
lc = len(c$)
if lx = lc then
x$ = x$ + c$
if haveAllDigits(x$) and a < b print a, " * ", b, " = ", c$
elseif lx > lc and lc = 5 then break
end if
next
next
sub haveAllDigits(a$)
local n(57), i, t
for i = 1 to len(a$)
t = asc(mid$(a$, i, 1))
n(t) = n(t) + 1
next
for i = 48 to 57 // ASCII codes from 0 to 9
if n(i) <> 1 return false // more than one occurrence
next
return true
end sub
--- End code ---
B+:
Simpler?
--- Code: ---_TITLE "All Digits Multiplication B+ mod of Galileo 2019-01-25"
'// Display all multiplications of two numbers such that,
' between the multiplicants and the result are represented once and only once each digit in the decimal system.
'// Developed in Yabasic by Galileo, 01/2019
FOR a = 1 TO 99
FOR b = 1 TO 9999
IF haveAllDigits(LTRIM$(STR$(a)) + LTRIM$(STR$(b)) + LTRIM$(STR$(a * b))) = -1 AND a < b THEN PRINT a, " * ", b, " = ", a * b
NEXT
NEXT
FUNCTION haveAllDigits (a$)
IF LEN(a$) <> 10 THEN EXIT FUNCTION
allDigits$ = "0123456789"
FOR i = 1 TO LEN(a$)
p = INSTR(allDigits$, MID$(a$, i, 1))
IF p THEN allDigits$ = MID$(allDigits$, 1, p - 1) + MID$(allDigits$, p + 1) ELSE EXIT FUNCTION
NEXT
haveAllDigits = -1
END FUNCTION
--- End code ---
Galileo:
I recognize that your code is of better quality than mine. Congratulations.
B+:
--- Quote from: Galileo on January 29, 2019, 05:01:50 PM ---I recognize that your code is of better quality than mine. Congratulations.
--- End quote ---
Thanks, I just learned that trick of eliminating matches at JB from Rod.
It should work well with letters say testing anagrams, maybe with Bulls and Cows game too.
Galileo:
iBASIC is an outdated interpreter developed by a spanish programmer. Slow, with many bugs but operational. It is interesting to try to write code that overcomes its limitations and takes advantage of its qualities.
--- Code: ---window TITLE "All Digits Multiplication Galileo mod of B+ 25/01/2019"
'// Display all multiplications of two numbers such that,
' between the multiplicants and the result are represented once and only once each digit in the decimal system.
'// Developed in Yabasic by Galileo, 01/2019
' iBASIC conversion of Galileo, 08/2019 (http://ibasic.arredemo.org/download.htm)
FOR a = 1 TO 99
FOR b = 1 TO 9999
IF call(haveAllDigits(TRIM$(STR$(a)) + TRIM$(STR$(b)) + TRIM$(STR$(a * b)))) = true AND a < b THEN PRINT a; "*"; b; "="; a * b
NEXT
NEXT
input chr$(10)+"Press ENTER to exit",a$
end
procedure haveAllDigits (in a$) returns r
la = LEN(a$)
IF la <> 10 THEN endproc
allDigits$ = "0123456789"
FOR i = 1 TO la
p = INSTR(allDigits$, a$[i])
IF p THEN allDigits$[p] = "" ELSE endproc
NEXT
r = true
ENDproc
--- End code ---
Navigation
[0] Message Index
[#] Next page
Go to full version