home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib35a.dsk / OCTOBER.1988 / LONG.NUMBR.CALC.bas < prev    next >
BASIC Source File  |  2023-02-26  |  4KB  |  124 lines

  1. 10  REM   *********************
  2. 20  REM   * LONG.NUMBER.CALC  *
  3. 30  REM   * BY ALAN H. STEIN  *
  4. 40  REM   * COPYRIGHT(C) 1988 *
  5. 50  REM   * MICROSPARC, INC.  *
  6. 60  REM   * CONCORD, MA 01742 *
  7. 70  REM   *********************
  8. 100  CLEAR 
  9. 110 B$ = "":ZERO$ = "0"
  10. 120 BS = 10
  11. 130  HOME : PRINT "ENTER 1ST # (OR PRESS RETURN TO QUIT)": PRINT "--> ";: GOSUB 1200:T$(1) = IN$: IF IN$ = ""  THEN 1190
  12. 140  PRINT : PRINT : PRINT "ENTER 2ND # (OR PRESS RETURN TO QUIT)": PRINT "--> ";: GOSUB 1200:T$(2) = IN$: IF IN$ = ""  THEN 1190
  13. 150  PRINT : PRINT :LMAX =  LEN(T$(1))
  14. 160  IF  LEN(T$(2)) >LMAX  THEN LMAX =  LEN(T$(2))
  15. 170 LMAX = 2 *LMAX +1
  16. 180  DIM T(3,LMAX +1)
  17. 190  GOSUB 920
  18. 200  PRINT : PRINT T$(1);" + (";T$(2);") = ";T$(3)
  19. 210  GOSUB 1020
  20. 220  PRINT : PRINT T$(1);" - (";T$(2);") = ";T$(3)
  21. 230  GOSUB 760
  22. 240  PRINT : PRINT T$(1);" * (";T$(2);") = ";T$(3)
  23. 250  VTAB 23: HTAB 1: PRINT "PRESS RETURN TO CONTINUE ";: POKE  -16368,0: GET A$: GOTO 100
  24. 260  REM UNSIGNED ADDITION
  25. 270  REM ADD T(1,*)+T(2,*), SUM T(3,*)
  26. 280 L(3) = L(1): IF L(2) >L(3)  THEN L(3) = L(2)
  27. 290  FOR J = 0 TO LMAX:T(3,J) = 0: NEXT J
  28. 300  FOR J = 0 TO L(3)
  29. 310 T(3,J) = T(1,J) +T(2,J) +T(3,J)
  30. 320  IF T(3,J) > = BS  THEN T(3,J) = T(3,J) -BS:T(3,J +1) = T(3,J +1) +1
  31. 330  NEXT J
  32. 340  IF T(3,L(3) +1) < >0  THEN L(3) = L(3) +1
  33. 350  RETURN 
  34. 360  REM UNSIGNED SUBRACTION
  35. 370  REM  FIND T(3,*)=ABS(T(1,*)-T(2,*))
  36. 380  GOSUB 670: REM FIND BIGGER ELEMENT
  37. 390 L(3) = L(1): IF L(2) >L(3)  THEN L(3) = L(2)
  38. 400  FOR J = 0 TO LMAX:T(3,J) = 0: NEXT J
  39. 410  FOR J = 0 TO L(3)
  40. 420 T(3,J) = T(BIG,J) -T(3 -BIG,J) +T(3,J)
  41. 430  IF T(3,J) <0  THEN T(3,J) = T(3,J) +BS:T(3,J +1) = T(3,J +1) -1: GOTO 430
  42. 440  NEXT J
  43. 450  RETURN 
  44. 460  REM TAKE STRING T$(I)
  45. 470  REM RETURN T(I,*)=INTEGER, L(I)=LENGTH, S$(I)=SIGN
  46. 480 T$ = T$(I)
  47. 490 S$(I) = B$: IF  LEFT$(T$,1) = "-"  THEN S$(I) = "-"
  48. 500 L(I) =  LEN(T$) -1: IF S$(I) = "-"  THEN L(I) = L(I) -1
  49. 510  FOR J = 0 TO L(I)
  50. 520 T(I,J) =  VAL( RIGHT$(T$,1))
  51. 530  IF J <L(I)  THEN T$ =  LEFT$(T$, LEN(T$) -1)
  52. 540  NEXT J
  53. 550  IF L(I) > = LMAX  THEN  RETURN 
  54. 560  FOR J = L(I) +1 TO LMAX:T(I,J) = 0: NEXT J
  55. 570  RETURN 
  56. 580  REM TAKE INTEGER T(I,*), SIGN S$(I)
  57. 590  REM RETURN STRING T$(I)
  58. 600 T$(I) = S$(I)
  59. 610  FOR J = L(I) TO 0  STEP  -1
  60. 620  IF T$(I) < >S$(I)  OR T(I,J) < >0  THEN T$(I) = T$(I) + STR$(T(I,J))
  61. 630  NEXT J
  62. 640  IF T$(I) = B$  THEN T$(I) = ZERO$
  63. 650  RETURN 
  64. 660  REM FIND BIGGER OF T$(1), T$(2)
  65. 670 BIG = 0
  66. 680  FOR J = LMAX TO 0  STEP  -1
  67. 690  IF BIG >0  THEN 720
  68. 700  IF T(1,J) >T(2,J)  THEN BIG = 1
  69. 710  IF T(2,J) >T(1,J)  THEN BIG = 2
  70. 720  NEXT J
  71. 730  IF BIG = 0  THEN BIG = 1
  72. 740  RETURN 
  73. 750  REM MULTIPLICATION OF INTEGERS
  74. 760  REM T$(3)=T$(1)*T$(2)
  75. 770  FOR I = 1 TO 2: GOSUB 470: NEXT I: REM CHANGE TO ARRAYS
  76. 780 L(3) = L(1) +L(2)
  77. 790  FOR J = 0 TO LMAX:T(3,J) = 0: NEXT J
  78. 800  FOR J1 = 0 TO L(1)
  79. 810  FOR J2 = 0 TO L(2)
  80. 820 J3 = J1 +J2
  81. 830 T(3,J3) = T(1,J1) *T(2,J2) +T(3,J3)
  82. 840  IF T(3,J3) > = BS  THEN T =  INT(T(3,J3)/BS):T(3,J3) = T(3,J3) -T *BS:T(3,J3 +1) = T(3,J3 +1) +T
  83. 850  NEXT J2
  84. 860  NEXT J1
  85. 870 S$(3) = B$: IF S$(1) < >S$(2)  THEN S$(3) = "-"
  86. 880  IF T(3,L(3) +1) < >0  THEN L(3) = L(3) +1
  87. 890 I = 3: GOSUB 590: REM CHANGE TO STRING T$(3)
  88. 900  RETURN 
  89. 910  REM ADDITION
  90. 920  FOR I = 1 TO 2: GOSUB 470: NEXT I
  91. 930  GOSUB 670: REM FIND BIGGER ELEMENT
  92. 940  IF S$(1) < >S$(2)  THEN 970
  93. 950  GOSUB 270: REM ADD
  94. 960  GOTO 990
  95. 970  REM DIFFERENT SIGNS
  96. 980  GOSUB 370: REM SUBTRACT
  97. 990 S$(3) = S$(BIG): GOSUB 590
  98. 1000  RETURN 
  99. 1010  REM SUBTRACTION
  100. 1020  FOR I = 1 TO 2: GOSUB 470: NEXT I
  101. 1030  GOSUB 670: REM FIND BIGGER ELEMENT
  102. 1040  IF S$(1) < >S$(2)  THEN 1130
  103. 1050  REM SAME SIGN
  104. 1060  GOSUB 370: REM SUBTRACT
  105. 1070  IF BIG = 2  THEN 1100
  106. 1080 S$(3) = S$(1)
  107. 1090  GOTO 1170
  108. 1100  REM REVERSE SIGN OF T(1,*)
  109. 1110  IF S$(1) = B$  THEN S$(3) = "-": GOTO 1170
  110. 1120 S$(3) = B$: GOTO 1170
  111. 1130  REM DIFFERENT SIGNS
  112. 1140  REM ADD AND TAKE SIGN OF FIRST ARGUMENT
  113. 1150  GOSUB 270: REM ADD
  114. 1160 S$(3) = S$(1)
  115. 1170  GOSUB 590
  116. 1180  RETURN 
  117. 1190  HOME : VTAB 23: END 
  118. 1200 IN$ = "":L = 0
  119. 1210  GET A$: IF A$ =  CHR$(13)  THEN  RETURN 
  120. 1220  IF A$ > = "0"  AND A$ < = "9"  THEN  PRINT A$;:IN$ = IN$ +A$:L = L +1: GOTO 1210
  121. 1230  IF L >1  AND A$ =  CHR$(8)  THEN L = L -1:IN$ =  LEFT$(IN$,L): CALL  -1008: PRINT " ";: CALL  -1008: GOTO 1210
  122. 1240  IF L = 1  AND A$ =  CHR$(8)  THEN  CALL  -1008: PRINT " ";: CALL  -1008: GOTO 1200
  123. 1250  IF L = 0  AND A$ = "-"  THEN IN$ = "-":L = 1: PRINT "-";: GOTO 1210
  124. 1260  PRINT  CHR$(7);: GOTO 1210