```          FLORIDA HIGH SCHOOLS COMPUTING COMPETITION '86
BASIC PROGRAM SOLUTIONS

'1.1
' This program will print "THIS IS THE EASIEST PROGRAM!".
'
CLS
A\$ = "THIS IS THE EASIEST PROGRAM!"
LOCATE 12, (80 - LEN(A\$)) / 2: PRINT A\$

'1.2
' This program will display the sum, difference, and product.
'
INPUT "Enter two numbers: "; A, B
PRINT "SUM = "; A + B
PRINT "DIFFERENCE = "; A - B
PRINT "PRODUCT = "; A * B

'1.3
' This program will sum 1 + (1/2)^2 + (1/3)^3 + (1/4)^4 + ...
' until the difference between it and the next term is within E.
'
INPUT "Enter test value E: "; E
I = 1
SUM = 1:  LSUM = 0
WHILE (SUM - LSUM) >= E
I = I + 1
TRM = 1 / I:  PROD = 1
FOR J = 1 TO I: PROD = PROD * TRM: NEXT J
LSUM = SUM
SUM = SUM + PROD
WEND
PRINT USING "#.######"; LSUM

'1.4
' This program will print a check given name and amount.
'
CLS
INPUT "Enter first name: "; F\$
INPUT "Enter middle name: "; M\$
INPUT "Enter last name: "; L\$
I\$ = LEFT\$(M\$, 1)
INPUT "Enter amount: "; AMOUNT\$
'  Display border
LOCATE 6, 1
PRINT STRING\$(39, "*")
FOR I = 1 TO 9
LOCATE 6 + I, 1: PRINT "*"
LOCATE 6 + I, 39: PRINT "*"
NEXT I
PRINT STRING\$(39, "*")
'
LOCATE 8, 3: PRINT "BEN'S TOWING SERVICE"
LOCATE 9, 3: PRINT "4563 WRECKER AVENUE"
LOCATE 10, 3: PRINT "WAVERLY, ARKANSAS 45632"
LOCATE 12, 4: PRINT "PAY TO THE ORDER OF ";
PRINT F\$; " "; I\$; ". "; L\$
LOCATE 14, 4: PRINT "THE SUM OF \$"; AMOUNT\$
LOCATE 22, 1

'1.5
' This program will determine which prisoners may be released.
'
DIM CELL(100)
FOR I = 1 TO 100: CELL(I) = 1: NEXT I    'Cells initially open
FOR I = 2 TO 100
J = 1
WHILE J <= 100
CELL(J) = 1 - CELL(J):  J = J + I
WEND
NEXT I
FOR I = 1 TO 100
IF CELL(I) = 1 THEN PRINT "CELL"; I
NEXT I

'1.6
' This program will determine how much money accumulates.
' Double precision variables (#) are needed.
'
INPUT "Enter monthly investment: "; MONTH#
INPUT "Enter end of year deposit: "; DEP#
INPUT "Enter annual rate of interest: "; RATE#
PRINT
RATE# = RATE# / (12 * 100) 'Rate per month in yr in percent
FOR YEAR = 1 TO 20
FOR J = 1 TO 12
SUM# = SUM# + MONTH#
SUM# = SUM# + RATE# * SUM#
NEXT J
SUM# = SUM# + DEP#
NEXT YEAR
SUM# = INT(SUM# * 100 + .5) / 100
PRINT "AMOUNT AT END OF YEAR 20 IS \$"; LTRIM\$(STR\$(SUM#))

'1.7
' This program will drop g in words ending with ing or ings.
'
INPUT "Enter sentence: "; S\$
S\$ = S\$ + " "
L = LEN(S\$): W\$ = ""
FOR I = 1 TO L
CH\$ = MID\$(S\$, I, 1)
IF CH\$ <> " " THEN
W\$ = W\$ + CH\$
ELSE
LENW = LEN(W\$)
IF LENW >= 4 THEN
EN1\$ = MID\$(W\$, LENW - 2, 3)
EN2\$ = MID\$(W\$, LENW - 3, 4)
IF EN1\$ = "ING" THEN W\$ = MID\$(W\$, 1, LENW - 1)
IF EN2\$ = "INGS" THEN W\$ = MID\$(W\$, 1, LENW - 2) + "S"
END IF
PRINT W\$; " ";
W\$ = ""
END IF
NEXT I

'1.8
' This program simulates the population growth of rabbits.
'
INPUT "Enter initial population: "; INIT
INPUT "Enter point of over population: "; OP
PRINT
POP = INIT
DIEING = (POP >= OP)
FOR MONTH = 1 TO 23
IF DIEING THEN
IF POP < 2 / 3 * INIT THEN
POP = POP + POP * .2: DIEING = 0
ELSE
POP = POP - POP * .15
END IF
ELSE
IF POP >= OP THEN
DIEING = -1:  INIT = INT(POP)
POP = POP - POP * .15
ELSE
POP = POP + POP * .2
END IF
END IF
PRINT "POPULATION FOR MONTH"; MONTH; "IS"; INT(POP + .5)
NEXT MONTH

'1.9
' This program doubles every e that appears as a single e.
'
INPUT "Enter sentence: "; SENT\$
FOR I = 1 TO LEN(SENT\$)
CH\$ = MID\$(SENT\$, I, 1)
NCH\$ = MID\$(SENT\$, I + 1, 1)
IF CH\$ = "E" AND LCH\$ <> "E" AND NCH\$ <> "E" THEN PRINT "E";
PRINT CH\$;
LCH\$ = CH\$
NEXT I
IF NCH\$ = "E" AND LCH\$ <> "E" THEN PRINT "E";
PRINT NCH\$

'1.10
' This program will display common elements of two lists.
'
DIM A(12), B(12), C(12)
FOR I = 1 TO 12
PRINT "Enter"; I; "of 12: "; : INPUT A(I)
NEXT I
FOR I = 1 TO 11
PRINT "Enter"; I; "of 11: "; : INPUT B(I)
NEXT I
'
FOR I = 1 TO 12
FOR J = 1 TO 11
IF A(I) = B(J) THEN C(I) = 1
NEXT J
NEXT I
FOR I = 1 TO 12
FOR J = I + 1 TO 12
IF A(I) = A(J) AND C(J) > 0 THEN C(J) = C(J) + 1
NEXT J
NEXT I
FOR I = 1 TO 12
IF C(I) = 1 THEN PRINT A(I); "  ";
NEXT I

'2.1
' This program will right justify sentence within 65 columns.
'
COL = 65
INPUT "Enter sentence: "; SENT\$
SENT\$ = SENT\$ + " ":  L = LEN(SENT\$)
I = 1: WN = 1: WORD\$(WN) = "":  TOTCH = 0
WHILE I <= L
CH\$ = MID\$(SENT\$, I, 1)
IF CH\$ <> " " THEN
WORD\$(WN) = WORD\$(WN) + CH\$
ELSE
IF WORD\$(WN) <> "" THEN
TOTCH = TOTCH + LEN(WORD\$(WN))
WN = WN + 1:  WORD\$(WN) = ""
END IF
END IF
I = I + 1
WEND
WN = WN - 1
'
SPAVE = INT((COL - TOTCH) / (WN - 1))
EXTRA = (COL - TOTCH) - (SPAVE * (WN - 1))
FOR I = 1 TO WN
IF I <= EXTRA THEN EX = 1 ELSE EX = 0
PRINT WORD\$(I); SPACE\$(SPAVE + EX);
NEXT I

'2.2
' This program will produce a repeating patern of XXX ---.
'
INPUT "Enter total number of X's and -'s: "; TOTALXD
INPUT "Enter number of X's: "; NUMX
INPUT "Enter number of rows: "; ROWS
X1\$ = "": X2\$ = "": D1\$ = "": D2\$ = ""
FOR I = 1 TO NUMX
X1\$ = X1\$ + "X"
D2\$ = D2\$ + "-"
NEXT I
FOR I = 1 TO TOTALXD - NUMX
X2\$ = X2\$ + "X"
D1\$ = D1\$ + "-"
NEXT I
FOR ROW = 1 TO ROWS
IF ROW - INT(ROW / 2) * 2 = 1 THEN
FOR I = 1 TO 4: PRINT X1\$; D1\$; : NEXT I
ELSE
FOR I = 1 TO 4: PRINT D2\$; X2\$; : NEXT I
END IF
PRINT
NEXT ROW

'2.3
' This program will code or decode a message.
'
ST1\$ = "ZXCVBNMASDFGHJKLQWERTYUIOP "
ST2\$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
WHILE OP < 3
PRINT
PRINT "1) ENCODE"
PRINT "2) DECODE"
PRINT "3) END"
INPUT "Choose: "; OP
IF OP = 3 THEN END
INPUT "Enter message: "; MESSAGE\$
FOR I = 1 TO LEN(MESSAGE\$)
CH\$ = MID\$(MESSAGE\$, I, 1)
IF CH\$ <> " " THEN
IF OP = 1 THEN
CH\$ = MID\$(ST1\$, ASC(CH\$) - 64, 1)
ELSE
J = INSTR(ST1\$, CH\$)
CH\$ = MID\$(ST2\$, J, 1)
END IF
END IF
PRINT CH\$;
NEXT I
PRINT
WEND

'2.4
' This program finds the unique mode of a set of 15 numbers.
'
DIM A(15), C(15)
FOR I = 1 TO 15
PRINT "Enter number"; I; ": "; : INPUT A(I)
NEXT I
MAX = 1
FOR I = 1 TO 14
C(I) = 1
FOR J = I + 1 TO 15
IF A(I) = A(J) THEN
C(I) = C(I) + 1
IF C(I) > MAX THEN MAX = C(I)
END IF
NEXT J
NEXT I
MODEXIST = 0
FOR I = 1 TO 14
IF C(I) = MAX THEN
IF MODEXIST THEN PRINT "NO UNIQUE MODE": END
MODE = A(I): MODEXIST = -1
END IF
NEXT I
IF MODEXIST THEN PRINT "MODE IS"; MODE: END
PRINT "NO UNIQUE MODE"

'2.5
' This program simulates transactions to savings a account.
'
RATE = .07
INPUT "Enter original balance: "; BALANCE
WHILE OP < 4
PRINT
PRINT "1. MAKE A DEPOSIT"
PRINT "2. MAKE A WITHDRAWAL"
PRINT "3. CREDIT INTEREST"
PRINT "4. END"
INPUT "Enter option: "; OP
PRINT
IF OP = 1 THEN
INPUT "Enter amount to deposit: "; DEP
PRINT USING "BALANCE BEFORE TRANSACTION \$####.##"; BALANCE
BALANCE = BALANCE + DEP
PRINT "MAKE A DEPOSIT"
ELSEIF OP = 2 THEN
INPUT "Enter amount to withdraw: "; WIT
PRINT USING "BALANCE BEFORE TRANSACTION \$####.##"; BALANCE
BALANCE = BALANCE - WIT
PRINT "MAKE A WITHDRAWAL"
ELSEIF OP = 3 THEN
PRINT USING "BALANCE BEFORE TRANSACTION \$####.##"; BALANCE
CREDIT = BALANCE * RATE / 12
CREDIT = INT(CREDIT * 100 + .5) / 100
PRINT USING "CREDIT INTEREST OF \$##.##"; CREDIT
BALANCE = BALANCE + CREDIT
END IF
IF OP < 4 THEN PRINT "NEW ";  ELSE PRINT "FINAL ";
PRINT USING "BALANCE \$####.##"; BALANCE
WEND

'2.6
' This program will sum two positive big numbers.
'
DIM A(39), B(39), C(39)
INPUT "ENTER FIRST NUMBER:  "; ST1\$
INPUT "ENTER SECOND NUMBER: "; ST2\$
L1 = LEN(ST1\$):  L2 = LEN(ST2\$)
FOR I = 1 TO L1
CH\$ = MID\$(ST1\$, L1 - I + 1, 1)
A(I) = VAL(CH\$)
NEXT I
FOR I = 1 TO L2
CH\$ = MID\$(ST2\$, L2 - I + 1, 1)
B(I) = VAL(CH\$)
NEXT I
'
IF L1 > L2 THEN MAXL = L1 ELSE MAXL = L2
FOR I = 1 TO MAXL
C(I) = A(I) + B(I) + CARRY
IF C(I) > 9 THEN C(I) = C(I) - 10: CARRY = 1 ELSE CARRY = 0
NEXT I
IF CARRY = 1 THEN MAXL = MAXL + 1: C(MAXL) = 1
PRINT "SUM IS ";
FOR I = MAXL TO 1 STEP -1
PRINT USING "#"; C(I);
NEXT I

'2.7
' This program will perform conversions.
'
DATA "INCHES","FEET","MILES","OUNCES","POUNDS","GALLONS"
FOR I = 1 TO 6:  READ DEC\$(I): NEXT I
DATA 2.54, 0.3048, 1.6093, 28.35, 0.4536, 3.7854
FOR I = 1 TO 6: READ CON(I): NEXT I
DATA "CENTIMETERS", "METERS", "KILOMETERS", "GRAMS"
DATA "KILOGRAMS", "LITERS"
FOR I = 1 TO 6: READ MET\$(I): NEXT I
'
WHILE OP <> 13
PRINT
FOR I = 1 TO 6
PRINT I;
IF I - INT(I / 2) * 2 = 1 THEN
ST\$ = MET\$(INT((I + 1) / 2)) + " TO "
ST\$ = ST\$ + DEC\$(INT((I + 1) / 2))
PRINT ST\$; SPACE\$(23 - LEN(ST\$));
PRINT USING "## "; I + 6;
ST\$ = MET\$(INT((I + 7) / 2)) + " TO "
ST\$ = ST\$ + DEC\$(INT((I + 7) / 2))
ELSE
ST\$ = DEC\$(INT(I / 2)) + " TO "
ST\$ = ST\$ + MET\$(INT(I / 2))
PRINT ST\$; SPACE\$(23 - LEN(ST\$));
PRINT USING "## "; I + 6;
ST\$ = DEC\$(INT((I + 6) / 2)) + " TO "
ST\$ = ST\$ + MET\$(INT((I + 6) / 2))
END IF
PRINT ST\$
NEXT I
PRINT SPACE\$(26); "13 END"
INPUT "Enter option: "; OP
IF OP < 13 THEN
IF OP - INT(OP / 2) * 2 = 1 THEN
PRINT "Enter number of "; MET\$(INT((OP + 1) / 2));
INPUT ": "; X
Y = X / CON(INT((OP + 1) / 2))
PRINT USING "THIS IS EQUIVALENT TO ###.### "; Y;
PRINT DEC\$(INT((OP + 1) / 2))
ELSE
PRINT "Enter number of "; DEC\$(INT(OP / 2));
INPUT ": "; X
Y = X * CON(INT(OP / 2))
PRINT USING "THIS IS EQUIVALENT TO ###.### "; Y;
PRINT MET\$(INT(OP / 2))
END IF
END IF
WEND

'2.8
' This program will generate a mortgage amortization.
' Double precision variables are needed.
'
INPUT "Enter principal: "; PRINC#
INPUT "Enter % rate of interest: "; RATE#
INPUT "Enter term in years: "; YEARS
INPUT "Enter # of month in year for first payment: "; MONTH
RATE# = RATE# / (12 * 100): AMOUNT# = 1
FOR I = 1 TO YEARS * 12: AMOUNT# = AMOUNT# * (1 + RATE#): NEXT I
PAYMENT# = (RATE# * AMOUNT#) / (AMOUNT# - 1) * PRINC#
C = MONTH - 1:  OLDP# = PRINC#
RATE# = RATE# * 12
PRINT "INTEREST         PRINCIPAL"
'
FOR I = 1 TO YEARS * 12
MI# = OLDP# * RATE# / 12
MP# = PAYMENT# - MI#
OLDP# = OLDP# - MP#
PRINT USING "\$###.##"; MI#; : PRINT SPACE\$(10);
PRINT USING "\$#####.##"; OLDP#
C = C + 1:  YI# = YI# + MI#
IF C - INT(C / 12) * 12 = 0 THEN
PRINT
PRINT USING "YEAR'S INTEREST  \$#####.##"; YI#
TI# = TI# + YI#:  YI# = 0
PRINT
A\$ = INPUT\$(1)
END IF
NEXT I
IF MONTH <> 1 THEN
PRINT
PRINT USING "YEAR'S INTEREST  \$#####.##"; YI#
TI# = TI# + YI#
END IF
PRINT USING "TOTAL INTEREST   \$#####.##"; TI#
PRINT USING "MONTHLY PAYMENT  \$#####.##"; PAYMENT#

'2.9
' This program calculates the value of sine(x) by a series.
' Double precision variables are needed.
'
INPUT "Enter N degrees: "; N
PI# = 3.1415926535#
IF N > 180 THEN X# = PI# * ((360 - N) / 180)
IF N <= 180 THEN X# = PI# * (N / 180)
POWER = -1
FOR I = 1 TO 6
POWER = POWER + 2:  FACT = 1
FOR J = 1 TO POWER: FACT = FACT * J: NEXT J
TRM# = 1
FOR J = 1 TO POWER: TRM# = TRM# * X#: NEXT J
TRM# = TRM# / FACT
IF I - INT(I / 2) * 2 = 1 THEN
SUM# = SUM# + TRM#
ELSE
SUM# = SUM# - TRM#
END IF
NEXT I
IF N > 180 THEN SUM# = -1 * SUM#:  X# = PI# * (N / 180)
PRINT "PARTIAL SUM ="; :       IF SUM# < 0 THEN PRINT " ";
PRINT USING "##.#######"; SUM#
PRINT "ACTUAL SINE ="; :       IF SIN(X#) < 0 THEN PRINT " ";
PRINT USING "##.#######"; SIN(X#)

'2.10
' This program will convert a Roman Numeral to Arabic form.
'
DATA M,1000, D,500, C,100, L,50, X,10, V,5, I,1
FOR I = 1 TO 7: READ RN\$(I), RV(I): NEXT I
INPUT "Enter Roman Numeral: "; ROMNUM\$
L = LEN(ROMNUM\$):  I = 1:  ARABIC = 0
WHILE I < L
FOR J = 1 TO 7
IF MID\$(ROMNUM\$, I, 1) = RN\$(J) THEN IND1 = J
IF MID\$(ROMNUM\$, I + 1, 1) = RN\$(J) THEN IND2 = J
NEXT J
IF IND1 <= IND2 THEN
ARABIC = ARABIC + RV(IND1)
ELSE
ARABIC = ARABIC + RV(IND2) - RV(IND1): I = I + 1
END IF
I = I + 1
WEND
IF I = L THEN
FOR J = 1 TO 7
IF MID\$(ROMNUM\$, I, 1) = RN\$(J) THEN IND1 = J
NEXT J
ARABIC = ARABIC + RV(IND1)
END IF
PRINT "ARABIC ="; ARABIC

'3.1
' This program produces montly calendars for the year 1986.
'
DATA JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY
DATA AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
DATA 31,28,31,30,31,30,31,31,30,31,30,31
DATA S,M,T,W,T,F,S
DIM MO\$(12), DAYS(12)
FOR I = 1 TO 12: READ MO\$(I): NEXT I
FOR I = 1 TO 12: READ DAYS(I): NEXT I
FOR I = 1 TO 7:  READ D\$(I): NEXT I
CLS : PRINT SPACE\$(12); "1986": PRINT
FOR M = 1 TO 12
IF M > 1 THEN CLS
PRINT SPACE\$(13 - INT(LEN(MO\$(M)) / 2)); MO\$(M): PRINT
FOR I = 1 TO 7: PRINT " "; D\$(I); "  "; : NEXT I
PRINT
'
IF M = 1 THEN COL = 4
IF COL > 1 THEN PRINT SPACE\$((COL - 1) * 4);
FOR DAY = 1 TO DAYS(M)
PRINT USING "##"; DAY; : PRINT "  ";
IF COL < 7 THEN COL = COL + 1 ELSE COL = 1: PRINT
NEXT DAY
A\$ = "":  WHILE A\$ = "": A\$ = INKEY\$: WEND
NEXT M

'3.2
' This program finds the root of a 5th degree polynomial
' of the form Ax^5 + Bx^4 + Cx^3 + Dx^2 + Ex + F = 0.
'
INPUT "Enter coefficients A,B,C,D,E,F: "; A, B, C, D, E, F
DEF FNY (Y) = C * Y ^ 3 + D * Y * Y + E * Y + F
DEF FNP (X) = A * X ^ 5 + B * X ^ 4 + FNY(X)
' This algorithm finds 1 and only 1 root (closest to x=0)
X1 = -1:  X2 = 1
' Find sign change between X1 and X2
WHILE FNP(X1) * FNP(X2) > 0
X1 = X1 - 1:  X2 = X2 + 1
WEND
' Use binary search to find root
WHILE X2 - X1 > .000005
X = (X1 + X2) / 2
IF FNP(X) * FNP(X1) > 0 THEN X1 = X ELSE X2 = X
WEND
PRINT "ROOT = ";
IF X < 0 THEN PRINT "-"; : X = -X
PRINT USING "#.#####"; X

'3.3
' This program changes a number from one base to another.
'
D\$ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
INPUT "Enter base A: "; A
INPUT "Enter base B: "; B
INPUT "Enter original number: "; NUMST\$
PRINT : PRINT NUMST\$; " BASE"; A; "EQUALS ";
FOR I = 1 TO LEN(NUMST\$)
POW = INT(A ^ (LEN(NUMST\$) - I) + .01)
N = N + (INSTR(D\$, MID\$(NUMST\$, I, 1)) - 1) * POW
NEXT I
POW = 1
WHILE POW <= N
EX = EX + 1: POW = POW * B
WEND
EX = EX - 1
' Convert Num to Base B from Base 10
FOR I = EX TO 0 STEP -1
POW = POW / B
X = INT(N / POW + .01)
PRINT MID\$(D\$, X + 1, 1);
N = N - X * POW
NEXT I
PRINT " BASE"; B

'3.4
' This progam will update customers account by SSN's.
'
DATA 234567890,"JOHN SMITH  "
DATA "1234 ANYWHERE LANE, EXIST, KANSAS 66754   ",345.78
DATA 564783219,"GAIL HUSTON "
DATA "543 SOUTH THIRD, BIG TOWN, TEXAS 88642    ",2365.89
DATA 873421765,"TIM JONES   "
DATA "2387 PALM PLACE, NOME, ALASKA 77643       ",6754.76
DATA 543876543,"JILL RUPERTS"
DATA "4536 123RD STREET, TINY TOWN, MAINE 76765 ",45.18
DATA 345212342,"AL BROWN    "
DATA "PO BOX 234, TINSEL TOWN, CALIFORNIA 77654 ",3456.09
DATA 565656565,"KERMIT TEU  "
DATA "1234 LOST LANE, WIMPLE, WISCONSIN 66543   ",78.36
FOR I = 1 TO 6: READ SS\$(I), N\$(I), A\$(I), B(I): NEXT I
INPUT "Enter SSN: "; SSN\$
WHILE SSN\$ <> "000000000"
I = 1
WHILE (SS\$(I) <> SSN\$) AND (I < 6): I = I + 1: WEND
INPUT "Enter C for Charge or P for Payment: "; CH\$
INPUT "Enter amount of transaction: "; TRANS
IF CH\$ = "C" THEN B(I) = B(I) - TRANS
IF CH\$ = "P" THEN B(I) = B(I) + TRANS
PRINT : PRINT USING "NEW BALANCE IS \$####.##"; B(I)
PRINT : INPUT "Enter SSN: "; SSN\$
WEND
FOR I = 1 TO 5
FOR J = I + 1 TO 6
IF B(I) < B(J) THEN
SWAP SS\$(I), SS\$(J)
SWAP N\$(I), N\$(J)
SWAP A(I), A(J)
SWAP B(I), B(J)
END IF
NEXT J
NEXT I
PRINT
PRINT "SSN        NAME          ADDRESS"; SPACE\$(13);
PRINT "BALANCE": PRINT
FOR I = 1 TO 6
PR\$ = SS\$(I) + "  " + N\$(I) + "  "
L = LEN(PR\$) - 1
P1 = INSTR(A\$(I), ",")
P2 = INSTR(P1 + 1, A\$(I), ",")
PRINT PR\$; LEFT\$(A\$(I), P1 - 1); SPACE\$(21 - P1);
PRINT USING "\$####.##"; B(I)
PRINT SPACE\$(L); MID\$(A\$(I), P1 + 1, P2 - P1 - 1)
PRINT SPACE\$(L); MID\$(A\$(I), P2 + 1)
NEXT I

'3.5
' This program will print the product of 2 large decimals.
'
DIM A(30), B(30), PROD(50)
INPUT "Enter first number: "; ASTR\$
INPUT "Enter second number: "; BSTR\$
ADEC = INSTR(ASTR\$, "."):  BDEC = INSTR(BSTR\$, ".")
ASTR\$ = LEFT\$(ASTR\$, ADEC - 1) + RIGHT\$(ASTR\$, LEN(ASTR\$) - ADEC)
BSTR\$ = LEFT\$(BSTR\$, BDEC - 1) + RIGHT\$(BSTR\$, LEN(BSTR\$) - BDEC)
LENA = LEN(ASTR\$):  LENB = LEN(BSTR\$)
RDIGITS = LENA - ADEC + LENB - BDEC + 2
FOR I = LENA TO 1 STEP -1
A(LENA - I + 1) = VAL(MID\$(ASTR\$, I, 1))
NEXT I
FOR I = LENB TO 1 STEP -1
B(LENB - I + 1) = VAL(MID\$(BSTR\$, I, 1))
NEXT I
FOR I = 1 TO LENB
CARRY = 0
FOR J = 1 TO LENA
S = I + J - 1
PROD(S) = PROD(S) + B(I) * A(J) + CARRY
CARRY = INT(PROD(S) / 10)
PROD(S) = PROD(S) - CARRY * 10
NEXT J
IF CARRY > 0 THEN PROD(S + 1) = CARRY
NEXT I
PRINT "PRODUCT = ";
IF CARRY > 0 THEN S = S + 1
IF S <= RDIGITS THEN PRINT "0";
FOR I = S TO 1 STEP -1
IF I = RDIGITS THEN PRINT ".";
PRINT USING "#"; PROD(I);
NEXT I

'3.6
' This program will determine if a # can become palindrome.
'
DIM B(50), REV(50)
INPUT "Enter number: "; NUMST\$
L = LEN(NUMST\$)
FOR I = 1 TO L
B(L - I + 1) = VAL(MID\$(NUMST\$, I, 1))
NEXT I
TRY = 0: PAL = 0
WHILE (TRY <= 23) AND (NOT PAL)
PAL = -1
FOR I = 1 TO INT(L / 2)
IF B(I) <> B(L - I + 1) THEN PAL = 0
NEXT I
' Add reverse of number to itself
IF NOT PAL THEN
FOR I = 1 TO L: REV(I) = B(L - I + 1): NEXT I
CARRY = 0
FOR I = 1 TO L
B(I) = B(I) + REV(I) + CARRY
CARRY = INT(B(I) / 10)
B(I) = B(I) - CARRY * 10
NEXT I
IF CARRY = 1 THEN L = L + 1: B(L) = 1
TRY = TRY + 1
END IF
WEND
IF NOT PAL THEN PRINT "CANNOT GENERATE A PALINDROME": END
FOR I = L TO 1 STEP -1: PRINT USING "#"; B(I); : NEXT I
PRINT " IS A PALINDROME"

'3.7
' This program will solve an N x N system of equations.
'
INPUT "Enter N: "; N
FOR ROW = 1 TO N
PRINT "Enter coefficients for row"; ROW
FOR COL = 1 TO N
PRINT USING "Co#"; COL; : PRINT ": ";
INPUT C(ROW, COL)
NEXT COL
INPUT "Enter constant: "; C(ROW, N + 1)
NEXT ROW
'     Make main diagonals all 1s with 0s to the left
FOR ROW = 1 TO N
DEN = C(ROW, ROW)
FOR COL = ROW TO N + 1
C(ROW, COL) = C(ROW, COL) / DEN
NEXT COL
FOR R = ROW + 1 TO N
X = C(R, ROW)
FOR COL = ROW TO N + 1
C(R, COL) = C(R, COL) - X * C(ROW, COL)
NEXT COL
NEXT R
NEXT ROW
'    Make 0s on the right of 1s on main diagonal, not const
FOR ROW = N TO 1 STEP -1
FOR R = ROW - 1 TO 1 STEP -1
X = C(R, ROW)
FOR COL = ROW TO N + 1
C(R, COL) = C(R, COL) - X * C(ROW, COL)
NEXT COL
NEXT R
NEXT ROW
'   Display solution
PRINT "("; LTRIM\$(STR\$(INT(C(1, N + 1) + .1)));
FOR ROW = 2 TO N
PRINT ", "; LTRIM\$(STR\$(INT(C(ROW, N + 1) + .1)));
NEXT ROW
PRINT ")"

'3.8
' This program prints Kth, 2*Kth, and 3*Kth permutations.
'
INPUT "Enter word: "; A\$:  INPUT "Enter K: "; KK:  L = LEN(A\$)
FOR I = 1 TO L: A\$(I) = MID\$(A\$, I, 1): NEXT I
' Alphabetize letters
FOR I = 1 TO L - 1
FOR J = I + 1 TO L
IF A\$(I) > A\$(J) THEN X\$ = A\$(I): A\$(I) = A\$(J): A\$(J) = X\$
NEXT J
NEXT I
' Produce factorials F(I) = (I-1)!
FOR I = 1 TO L
F = 1
FOR J = 1 TO I - 1: F = F * J: NEXT J
F(I) = F
NEXT I
FOR T = 1 TO 3
K = KK * T - 1
'     Generate Kth permutation
FOR I = L TO 1 STEP -1
X = INT(K / F(I))
FOR J = 1 TO L
IF A(J) = 0 THEN
S = S + 1: IF S > X THEN A(J) = 1: PRINT A\$(J); : J = L
END IF
NEXT J
S = 0: K = K - F(I) * X
NEXT I
FOR I = 1 TO L: A(I) = 0: NEXT I
PRINT "  ";
NEXT T

'3.9
' This program will solve cryptarithm puzzle ABB - CB = DEF.
' F = 0 since B-B = 0.  A=D+1 or A=D since CB is 2 digits,
' but A<>D.  D>B, otherwise D=A.  Since B E=10+B-C
'
FOR B = 1 TO 8
FOR C = B + 1 TO 9
FOR D = 1 TO 8
F = 0: A = D + 1:  E = 10 + B - C
IF A = B OR A = C OR A = D OR A = E OR A = F THEN PASS = 1
IF B = C OR B = D OR B = E OR B = F OR C = D THEN PASS = 1
IF C = E OR C = F OR D = E OR D = F THEN PASS = 1
IF PASS = 0 THEN
TOT = TOT + 1
PRINT A * 100 + B * 10 + B; "-"; C * 10 + B; "=";
PRINT D * 100 + E * 10 + F; " NUMBER"; TOT
ELSE
PASS = 0
END IF
NEXT D
NEXT C
NEXT B
PRINT : PRINT " TOTAL NUMBER OF SOLUTIONS ="; TOT

'3.10
' This program will find all 2-digit integers equal to the sum
' of integers in which each digit 0-9 is used exactly once.
'
FOR I = 0 TO 8
'   Place digit I infront of 0 and sum the rest of the digits
SUM = I * 10 + 0
FOR J = 0 TO 9
IF (I <> J) AND (J <> 0) THEN
TRM = J: SUM = SUM + J
END IF
NEXT J
IF SUM <= 99 THEN
'    Display sum followed by example sum process
PRINT SUM; "=";
PRINT I * 10 + 0;
FOR J = 0 TO 9
IF (I <> J) AND (J <> 0) THEN
TRM = J: PRINT "+"; J;
END IF
NEXT J
PRINT
END IF
NEXT I

```