January 24, 2021, 12:41:47 PM

### Author Topic: [bb] megacalculs by Vignoli [ 1+ years ago ]  (Read 412 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bb] megacalculs by Vignoli [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : megacalculs
Author : Vignoli
Posted : 1+ years ago

Description : With those functions you can make a quick addition, substraction and multiplication directly with strings. Division is very slow.
Support big numbers.

(Now compatible with b+ and b3d)

Todo : "float string numbers" for division, and quick division

Code :
Code: BlitzBasic
1. ;=====================
2. ;    megacalculs 1
3. ;=====================
4.
5.
6. ; Initialisation
7. ;================
8.
9. Dim table(9,10)
10. Dim retenue(9,10)
11.
12. For i=0 To 9
13.         For j=0 To 10
14.                 table(i,j)=i+j
15.                 If table(i,j)>9 Then table(i,j)=table(i,j)-10 : retenue(i,j)=1 Else retenue(i,j)=0
16.         Next
17. Next
18.
19. Dim table2(10,10)
20. Dim retenue2(10,10)
21. For i=0 To 10
22.         For j=0 To 10
23.                 table2(i,j)=i-j
24.                 If table2(i,j)<0 Then table2(i,j)=table2(i,j)+10 : retenue2(i,j)=1 Else retenue2(i,j)=0
25.         Next
26. Next
27.
28. ; Principal Loop
29. ;===================
30.
31. Repeat
32.
33. Print"Premier nombre  (first number) : "
34. v1\$=Input("")
35. Print"Operation (+ - * /) :"
36. op\$=Input("")
37. Print"Deuxieme nombre (second number) : "
38. v2\$=Input("")
39.
40.
41. If Left(v1\$,1)="-" Then sig1\$="-" Else sig1\$=""
42. If Left(v2\$,1)="-" Then sig2\$="-" Else sig2\$=""
43.
44. If op\$="+"
45.         sig3\$=""
46.         If sig1\$="-" And sig2\$="-" Then sig3\$="-" : v1\$=Mid(v1\$,2) : v2\$=Mid(v2\$,2) : sig1\$="" : sig2\$=""
47.         If sig1\$="-" Then v1\$=Mid(v1\$,2) : a\$=v1\$ : v1\$=v2\$ : v2\$=a\$: sig2\$="" : sig1\$="" : op\$="-"
48.         If sig2\$="-" Then v2\$=Mid(v2\$,2) : op\$="-" : sig1\$="" : sig2\$=""
49. Else
50.         If op\$="-"
51.                 sig3\$=""
52.                 If sig1\$="-" And sig2\$="" Then sig3\$="-" : v1\$=Mid(v1\$,2) : sig1\$="" : sig2\$="" : op\$="+"
53.                 If sig1\$="-" And sig2\$="-" Then v1\$=Mid(v1\$,2) : v2\$=Mid(v2\$,2) : a\$=v1\$ : v1\$=v2\$ : v2\$=a\$: sig2\$="" : sig1\$=""
54.                 If sig2\$="-" Then v2\$=Mid(v2\$,2) : sig1\$="" : sig2\$="" : op\$="+"
55.         Else
56.                 If op\$="*" Or op\$="/"
57.                         sig3\$=""
58.                         If sig1\$="-" And sig2\$="-" Then v1\$=Mid(v1\$,2) : v2\$=Mid(v2\$,2) : sig1\$="" : sig2\$=""
59.                         If sig1\$="-" And sig2\$="" Then sig3\$="-" : v1\$=Mid(v1\$,2) : sig1\$="" : sig2\$=""
60.                         If sig2\$="-" And sig1\$="" Then sig3\$="-" : v2\$=Mid(v2\$,2) : sig1\$="" : sig2\$=""
61.                 EndIf
62.         EndIf
63. EndIf
64.
65. virg=0
66. virg1=0
67. virg2=0
68. If op\$="+" Or op\$="-" Or op\$="*"
69.         If Instr(v1\$,".")<>0
70.                 newv1\$=v1\$
71.                 v1\$=""
72.                 While Right(newv1\$,1)<>"."
73.                         v1\$=Right(newv1\$,1)+v1\$
74.                         virg1=virg1+1
75.                         newv1\$=Mid(newv1\$,1,Len(newv1\$)-1)
76.                 Wend
77.                 v1\$=Mid(newv1\$,1,Len(newv1\$)-1)+v1\$
78.         EndIf
79.         If Instr(v2\$,".")<>0
80.                 newv2\$=v2\$
81.                 v2\$=""
82.                 While Right(newv2\$,1)<>"."
83.                         v2\$=Right(newv2\$,1)+v2\$
84.                         virg2=virg2+1
85.                         newv2\$=Mid(newv2\$,1,Len(newv2\$)-1)
86.                 Wend
87.                 v2\$=Mid(newv2\$,1,Len(newv2\$)-1)+v2\$
88.         EndIf
89.         If op\$="+" Or op\$="-"
90.                 If virg1>0 Or virg2>0
91.                         If virg1>virg2
92.                                 nbz=virg1-virg2
93.                                 For i=1 To nbz
94.                                         v2\$=v2\$+"0"
95.                                 Next
96.                                 virg2=virg1
97.                         EndIf
98.                         If virg2>virg1
99.                                 nbz=virg2-virg1
100.                                 For i=1 To nbz
101.                                         v1\$=v1\$+"0"
102.                                 Next
103.                                 virg1=virg2
104.                         EndIf
105.                 EndIf
106.         EndIf
107.         If op\$="*" Then virg1=virg1+virg2
108.         virg=virg1
109. EndIf
110.
111. If op\$="+" Then Gosub addition
112. If op\$="-" Then Gosub soustraction
113. If op\$="*" Then Gosub multiplicationrapide
114. If op\$="/" Then Gosub division
115.
116.
117. If virg>0
118.         tempres\$=res\$
119.         res\$=""
120.         While virg>0 And tempres\$<>""
121.                 res\$=Right(tempres\$,1)+res\$
122.                 tempres\$=Left(tempres\$,Len(tempres\$)-1)
123.                 virg=virg-1
124.         Wend
125.         res\$=tempres\$+"."+res\$
126.         While Right(res\$,1)="0"
127.                 res\$=Left(res\$,Len(res\$)-1)
128.         Wend
129.         If Right(res\$,1)="." Then res\$=Left(res\$,Len(res\$)-1)
130.         If res\$="" Then res\$="0"
131. EndIf
132.
133.
134.
135. If sig3\$="-" And res\$<>"0" Then res\$="-"+res\$
136.
137. res2\$=""
138. If op\$="/" And reste\$<>"0" Then res2\$=" reste "+reste\$
139. Print ""
140. Print ""
141. Print "Resultat : "
142. Print res\$+res2\$
143. Print ""
144. Print ""
145.
146. Forever
147.
148. End
149.
150. ; SubRoutines & fonctions
151. ;=========================
152.
155. l=maxi(Len(v1\$),Len(v2\$))
156. If Len(v1\$)<l Then a\$=v1\$ : v1\$=v2\$ : v2\$=a\$
157. While Len(v2\$)<l
158.         v2\$="0"+v2\$
159. Wend
160. res\$=""
161. For i=l To 1 Step -1
162.         c1=Int(Mid(v1\$,i,1))
163.         c2=Int(Mid(v2\$,i,1))
164.         If i<l Then c2=c2+retenue(exc1,exc2)
165.         exc1=c1
166.         exc2=c2
167.         res\$=Str(table(c1,c2))+res\$
168. Next
169. If retenue(exc1,exc2)>0 Then res\$="1"+res\$
170. While Len(res\$)>1 And Left(res\$,1)="0"
171.         res\$=Mid(res\$,2)
172. Wend
173. Return
174.
175. ; substract quickly
176. .soustraction
177. l=maxi(Len(v1\$),Len(v2\$))
178. If Len(v1\$)<l Then a\$=v1\$ : v1\$=v2\$ : v2\$=a\$ : sig\$="-" Else sig\$=""
179. While Len(v2\$)<l
180.         v2\$="0"+v2\$
181. Wend
182. i=1
183. While i<=l
184.         If Int(Mid(v1\$,i,1))<Int(Mid(v2\$,i,1)) Then flag=1 : i=l+1
185.         If Int(Mid(v1\$,i,1))>Int(Mid(v2\$,i,1)) Then flag=0 : i=l+1
186.         i=i+1
187. Wend
188. If flag=1 Then a\$=v1\$ : v1\$=v2\$ : v2\$=a\$ : If sig\$="" Then sig\$="-" Else sig\$=""
189. If Len(v1\$)=Len(v2\$) Then v1\$="0"+v1\$ : v2\$="0"+v2\$ : l=l+1
190. res\$=""
191. For i=l To 1 Step -1
192.         c1=Int(Mid(v1\$,i,1))
193.         c2=Int(Mid(v2\$,i,1))
194.         If i<l Then c2=c2+retenue2(exc1,exc2)
195.         exc1=c1
196.         exc2=c2
197.         res\$=Str(table2(c1,c2))+res\$
198. Next
199. While Len(res\$)>1 And Left(res\$,1)="0"
200.         res\$=Mid(res\$,2)
201. Wend
202. res\$=sig\$+res\$
203. Return
204.
205. ; slow multiplication (used by quick multiplication)
206. .multiplication
207. If IsZero(v1\$)=True Or IsZero(v2\$)=True Then res\$="0" : Return
208. memv2\$=v2\$
209. memv11\$=v1\$
210. v2\$=v1\$
211. Repeat
212. If IsZero(memv2\$)=False
214.         memv1\$=res\$
215.         v1\$=memv2\$
216.         v2\$="1"
217.         Gosub soustraction
218.         memv2\$=res\$
219.         v1\$=memv1\$
220.         v2\$=memv11\$
221. EndIf
222. If IsZero(memv2\$)=True Then Exit
223. Forever
224. Gosub soustraction
225. While Len(res\$)>1 And Left(res\$,1)="0"
226.         res\$=Mid(res\$,2)
227. Wend
228. Return
229.
230. ; slow division
231. .division
232. If IsZero(v1\$)=True Or IsZero(v2\$)=True Then res\$="0" : Return
233. memv11\$="0"
234. memv2\$=v2\$
235. memv1\$=v1\$
236. Repeat
237. If IsZero(v1\$)=False And Left(v1\$,1)<>"-"
238.         memres\$=v1\$
239.         Gosub soustraction
240.         memv1\$=res\$
241.         If Left(res\$,1)<>"-"
242.                 v1\$=memv11\$
243.                 v2\$="1"
245.                 memv11\$=res\$
246.         EndIf
247.         v1\$=memv1\$
248.         v2\$=memv2\$
249. EndIf
250. If IsZero(v1\$)=True Or Left(v1\$,1)="-" Then Exit
251. Forever
252. If Left(v1\$,1)="-" Then a\$=v1\$ : v1\$=v2\$ : v2\$=a\$ : v2\$=Mid(v2\$,2) : Gosub soustraction : reste\$=res\$ Else reste\$="0"
253. res\$=memv11\$
254. If Left(reste\$,1)="-" Then reste\$=Mid(reste\$,2)
255. While Len(res\$)>1 And Left(res\$,1)="0"
256.         res\$=Mid(res\$,2)
257. Wend
258. Return
259.
260. Function IsZero(a\$)
261. For i=1 To 9
262.         If Instr(a\$,Str(i))<>0 Then Return False
263. Next
264. Return True
265. End Function
266.
267. Function maxi(a,b)
268. If a>=b Then Return a Else Return b
269. End Function
270.
271. ; quick multiplication
272. .multiplicationrapide
273. total\$="0"
274. myv1\$=v1\$
275. myv2\$=v2\$
276. For k=Len(myv2\$) To 1 Step -1
277.         v1\$=myv1\$
278.         v2\$=Mid(myv2\$,k,1)
279.         Gosub multiplication
280.         kzero\$=""
281.         j=Len(myv2\$)-k
282.         While j>0
283.                 kzero\$=kzero\$+"0"
284.                 j=j-1
285.         Wend
286.         v1\$=res\$+kzero\$
287.         v2\$=total\$
289.         total\$=res\$
290. Next
291. res\$=total\$
292. Return