January 24, 2021, 12:41:47 PM

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

Offline 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.  
  153. ; add quickly
  154. .addition
  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
  213.         Gosub addition
  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"
  244.                 Gosub addition
  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$
  288.         Gosub addition
  289.         total$=res$
  290. Next
  291. res$=total$
  292. Return


Comments :


Vignoli(Posted 1+ years ago)

 Source code updated


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal