09-26-2022, 04:15 PM
(09-25-2022, 08:28 PM)Jack Wrote: not bad
@Jack
I did find one error. oldx$ needed to be zeroed. Apparently, when a digit in the answer is zero, oldx$ did not get redefined, as the loop exited before that could happen. I zeroed it in the DO:LOOP, and now it works as expected. It took some testing to see that error produced. I noticed it on the cube root of 19.
QUESTION: By any chance do you know in situations where the digits will not terminate before the digit limit is reached, or simply will not terminate like pi, is there anyway the remainder can be made into a fraction, as in regular long division?
Here is a brief example in numeric form with printed inf to the screen. The "Target" is the remainder and "d" is the growing answer per digit. Note: Ignore decimal point. It's buggy. Left over from a square root prog and needs further tweaking.
Code: (Select All)
$CONSOLE:ONLY
DIM AS DOUBLE d, i, j, r, t, x, oldx
LINE INPUT "Whole number: "; n$
LINE INPUT "Root: "; r$
r = VAL(r$)
'''n$ = LTRIM$(STR$(n%))
hh&& = LEN(n$)
h&& = (r - (r - LEN(n$) MOD r)) + 1
t = VAL(MID$(n$, 1, h&& - 1))
limit&& = 8
' Calculate Pascal's Triangle.
REDIM p$(r + 1)
FOR i1&& = 1 TO r + 1
p&& = 1
FOR j1&& = 1 TO i1&&
p$(j1&&) = LTRIM$(STR$(p&&))
p&& = p&& * (i1&& - j1&&) \ j1&&
NEXT
NEXT
DO
oldx = 0
lcnt&& = lcnt&& + 1
PRINT "Target ="; t
FOR j = 1 TO 10
x = 0
FOR i = 1 TO r
p&& = VAL(p$(i))
IF i = 1 THEN
PRINT i; p&&; j; d; " (10 ^"; (i - 1); "*"; p&&; "* d ^"; i - 1; " * j ^"; (r + 1 - i); ") + "
x = x + 10 ^ (i - 1) * p&& * d ^ (i - 1) * j ^ (r + 1 - i)
ELSE
PRINT i; p&&; j; d; " (10 ^"; (i - 1); "*"; p&&; "* d ^"; i - 1; " * j ^"; (r + 1 - i); ") + "
x = x + 10 ^ (i - 1) * p&& * d ^ (i - 1) * j ^ (r + 1 - i)
END IF
NEXT
PRINT "<<<"; x;" Press a key to cont...": SLEEP
IF x > t THEN EXIT FOR
oldx = x: COLOR 6: PRINT "oldx ="; oldx, t; oldx >= t: COLOR 7
NEXT
d = VAL(LTRIM$(STR$(d)) + LTRIM$(STR$(j - 1)))
PRINT "t - oldx as: "; t; "-"; oldx; "="; t - oldx,: COLOR 14: PRINT "d ="; d: COLOR 7
tmp1$ = LTRIM$(STR$(t - oldx))
tmp2$ = MID$(n$, h&&, r) + STRING$(r - LEN(MID$(n$, h&&, r)), "0")
t = VAL(tmp1$ + tmp2$) ' This will remove any leading zeros carried down.
h&& = h&& + r
IF t = 0 AND h&& >= LEN(n$) OR lcnt&& = limit&& THEN EXIT DO
t$ = LTRIM$(STR$(t))
IF dpx&& = 0 THEN ' Decimal point relocator. Limited to && size unless converted to string.
IF h&& >= hh&& THEN
dpx&& = INT(hh&& / 2 + .5)
IF dpx&& = 0 THEN dpx&& = -1 ' Do not set to zero as -1 accomplishes the same thing and prevents ongoing loops here.
END IF
END IF
LOOP
d$ = LTRIM$(STR$(d))
IF dpx&& THEN
sm_rt$ = MID$(d$, 0, dpx&& + 1) + "." + MID$(d$, dpx&& + 1)
ELSE
sm_rt$ = d$
END IF
PRINT
PRINT "Answer: "; sm_rt$
PRINT
RUN
Thanks for having a look.
Pete