PDA

View Full Version : عملیات بر روی اعداد بزرگ ( Large Number Operations )



hamed aj
یک شنبه 19 آبان 1387, 12:08 عصر
با سلام

حتماً شما هم در نوشتن خیلی از برنامه ها به مشکل محدود بودن اندازه اعداد و متغیر ها بر خورد کردین. البته خود VB برای این مسئله نوع هایی رو معرفی کرده که از نماد های علمی (e) استفاده می کنند. این روش اگر چه روش خوبی هست، ولی با مشکلات و محدودیت هایی مثل محدود بودن اندازه (مثلاً 302 رقم) ، روند کردن عدد (که از دقت کار کم میکند) ، عدم نمایش کامل همه ی ارقام عدد و ... روبرو هست
در این تاپیک قرار هست کدها یا برنامه هایی رو قرار بدیم که بر روی اعداد با ارقام زیاد عملیات ریاضی انجام می دهند

دوستان لطف کنید همکاری کنید تا یه مجموعه کامل و مناسب از این برنامه ها و کد ها در اینجا گردآوری کنیم

hamed aj
دوشنبه 20 آبان 1387, 13:40 عصر
این برنامه عملیات جمع کردن اعداد بزرگ را انجام می دهد (اعداد با ارقام بسیار زیاد)

در این تصویر من دو عدد 100000 ( یکصد هزار ) رقمی رو با هم جمع کردم و ملاحظه می کنید که برنامه در کمتر از 6 ثانیه به جواب نهایی رسید (البته با یک پردازنده 2 گیگا هرتزی و 1 گیگ رم)
25358


تابع برنامه رو طوری نوشتم که دو عدد ورودی بصورت رشته دریافت میشوند و حاصل جمع نیز یک رشته خواهد بود.

دوستان اگر وقت دارید لطف کنید و برنامه رو روی سیستم(های) خودتون تست کنید و نتیجه رو به همراه مشخصات سیستم(ها) بصورت تصویر یا متن اینجا قرار بدین (زمان محاسبه اهمیت داره)

امیدوارم برای دوستان مفید واقع بشه


برنامه رو می تونید از اینجا دریافت کنید

hamed aj
پنج شنبه 23 آبان 1387, 14:10 عصر
با سلام

حتماً شما هم با تبدیل کننده های اعداد مبنای 10 به اعداد مبنای 2 یا همان باینری کار کردین. مشکل توابع مذکور اینه که اندازه ی عدد ورودی محدود هست، مثلاً در رنج Long.

تابعی که در زیر می بینید طوری طراحی شده که این مشکل رو از میان برداشته. این تابع قادر به تبدیل اعداد در مبنای 10 با هر تعداد رقم به مبنای 2 هست





Function Dec2Bin_LargeNumber(ByVal Decimal_Number As String) As String

Dim strDec_Num, strBin_Num As String
Dim RightOneNum As Byte
Dim carry, t1 As Byte
Dim i As Long

strDec_Num = Decimal_Number
strBin_Num = ""

carry = 0
If (strDec_Num = "0") Then
Dec2Bin_LargeNumber = "0"
Exit Function
End If

Do While (strDec_Num <> "1")

If (Not IsNumeric(Mid$(strDec_Num, Len(strDec_Num), 1))) Then
Dec2Bin_LargeNumber = "Invalid Number"
Exit Function
End If

RightOneNum = CByte(Mid$(strDec_Num, Len(strDec_Num), 1))
If ((RightOneNum Mod 2) = 1) Then
RightOneNum = RightOneNum - 1
strDec_Num = Mid$(strDec_Num, 1, Len(strDec_Num) - 1)
strDec_Num = strDec_Num + CStr(RightOneNum)

strBin_Num = "1" + strBin_Num
Else
strBin_Num = "0" + strBin_Num
End If


'Div to 2
For i = 1 To Len(strDec_Num)
t1 = CByte(Mid$(strDec_Num, i, 1))
If ((t1 Mod 2) = 1) Then
t1 = (t1 \ 2) + carry
carry = 5
Else
t1 = (t1 \ 2) + carry
carry = 0
End If
strDec_Num = Mid$(strDec_Num, 1, (i - 1)) + CStr(t1) + Mid$(strDec_Num, (i + 1), Len(strDec_Num))
Next i


'LeftZero'sRemoving
For i = 1 To Len(strDec_Num)
t1 = CByte(Mid$(strDec_Num, i, 1))
If (t1 <> 0) Then
strDec_Num = Mid$(strDec_Num, i, (Len(strDec_Num) - i + 1))
Exit For
End If
Next i

Loop

strBin_Num = "1" + strBin_Num



Dec2Bin_LargeNumber = strBin_Num


End Function



در ضمن یک نمونه برنامه برای این تابع نوشتم که قابلیت اون رو بصورت عملی مشاهده کنید
در عکس زیر می بینید که من یک عدد 2084 رقمی رو تبدیل کردم، عدد باینری حاصل 6917 بیت شد. البته این تبدیل در 18 ثانیه با یک cpu 2GHz و Ram 1G زمان برد

25449

دوستان اگر وقت داشتین برنامه رو روی سیستم خودتون تست کنید و حاصل رو در این تاپیک قرار بدین.

اگر راهکار یا تکنیکی هم دارید که بشه زمان محاسبه رو کاهش داد، دریغ نکنید


برنامه رو میتونید از اینجا دریافت کنید

امیدوارم مفید واقع بشه

hamed aj
شنبه 16 آذر 1387, 14:32 عصر
برنامه زیر برای تبدیل اعداد باینری (دو دویی) به اعداد دسیمال یا همان اعداد مبنای ده می باشد

ورودی یک رشته از اعداد باینری (0 و 1) می باشد و خروجی نیز تبدیل شده ی این عدد در مبنای ده را نشان می دهد



برنامه رو میتونید از اینجا دریافت کنید

Dr.Bronx
شنبه 16 آذر 1387, 16:38 عصر
اين محاسبه
http://i37.tinypic.com/2ntd4qb.jpg

اين هم سيستم
http://i37.tinypic.com/a44pkn.jpg

aryasoft2872
یک شنبه 02 خرداد 1389, 20:34 عصر
خوب این برنام ه همین کار رو می کنه...

اینم مال من:

دوعدد 200000 رقمی (دویست هزار) با cpu 3 دوهسته ای و رم 2GB:
12,87475 ثانیه

andaron
یک شنبه 02 خرداد 1389, 21:03 عصر
منم تست کردم دو عدد 200 هزار رقمی
7.66 ثانیه

خوب سخته من بتون سر از کار اینتابع درارم