Determine the four smallest but different three digit positive decimal integers commencing with the same digit, such that their sum is divisible by precisely three of the said numbers.
What are the five smallest but different four digit positive decimal integers commencing with the same digit, such that their sum is divisible by precisely four of the said numbers?
(In reply to
part 2: the only one by Charlie)
A variant of the program for part 2 verifies that the solution already given for part 1 is also unique--that is, not only the smallest such set of numbers but the only such set:
108 180 135 117 540
DEFDBL A-Z
DECLARE SUB factor (num, s$)
DIM nFct
DIM fct(30)
DIM fact(100)
CLS
FOR nbr = 400 TO 5555
factor nbr, f$
f$ = LTRIM$(f$) + " "
nFct = 0
DO
ix = INSTR(f$, " ")
IF ix > 0 THEN
n = VAL(LEFT$(f$, ix - 1))
f$ = MID$(f$, ix + 1)
nFct = nFct + 1
fct(nFct) = n
END IF
LOOP UNTIL f$ = ""
npFct = 0: REDIM digCt(9)
FOR combo = 1 TO INT(2 ^ nFct - .5)
prod = 1: pwr2 = 1
FOR j = 1 TO nFct
IF pwr2 AND combo THEN prod = prod * fct(j)
pwr2 = pwr2 * 2
NEXT
IF prod > 99 AND prod < 1000 THEN
good = 1
FOR i = 1 TO npFct
IF fact(i) = prod THEN good = 0: EXIT FOR
NEXT
IF good THEN
npFct = npFct + 1
fact(npFct) = prod
digCt(prod \ 100) = digCt(prod \ 100) + 1
END IF
END IF
NEXT
FOR d = 1 TO 9
IF digCt(d) >= 3 THEN
FOR n1 = 1 TO digCt(d) - 2
FOR n2 = n1 + 1 TO digCt(d) - 1
FOR n3 = n2 + 1 TO digCt(d)
upto = 0
FOR i = 1 TO npFct
IF fact(i) \ 100 = d THEN
upto = upto + 1
IF upto = n1 OR upto = n2 OR upto = n3 THEN
tot = tot + fact(i)
n(upto) = fact(i)
IF upto = n3 OR tot > nbr - 99 THEN EXIT FOR
END IF
END IF
NEXT
diff = nbr - tot
IF diff \ 100 = d THEN
IF nbr MOD diff > 0 THEN
FOR i = 1 TO 3
PRINT n(i);
NEXT
PRINT diff, nbr
END IF
END IF
NEXT
NEXT
NEXT
END IF
NEXT
NEXT
SUB factor (num, s$)
s$ = "": n = ABS(num): IF n > 0 THEN limit = SQR(n): ELSE limit = 0
IF limit <> INT(limit) THEN limit = INT(limit + 1)
dv = 2: GOSUB DivideIt
dv = 3: GOSUB DivideIt
dv = 5: GOSUB DivideIt
dv = 7
DO UNTIL dv > limit
GOSUB DivideIt: dv = dv + 4 '11
GOSUB DivideIt: dv = dv + 2 '13
GOSUB DivideIt: dv = dv + 4 '17
GOSUB DivideIt: dv = dv + 2 '19
GOSUB DivideIt: dv = dv + 4 '23
GOSUB DivideIt: dv = dv + 6 '29
GOSUB DivideIt: dv = dv + 2 '31
GOSUB DivideIt: dv = dv + 6 '37
IF INKEY$ = CHR$(27) THEN s$ = CHR$(27): EXIT SUB
LOOP
IF n > 1 THEN s$ = s$ + STR$(n)
EXIT SUB
DivideIt:
DO
q = INT(n / dv)
IF q * dv = n AND n > 0 THEN
n = q
s$ = s$ + STR$(dv)
IF n > 0 THEN limit = SQR(n): ELSE limit = 0
IF limit <> INT(limit) THEN limit = INT(limit + 1)
ELSE
EXIT DO
END IF
LOOP
RETURN
END SUB
|
Posted by Charlie
on 2006-09-25 14:51:40 |