View Full Version : عملیات روی اعداد بزرگ
ICEMAN
شنبه 15 دی 1386, 10:15 صبح
سلام ...
من در این مورد زیاد سورس دیدم در حالت های زیاد ولی اکثرا با آرایه ها و vector ها کار کرده بودن
ولی مثالی با Pointer ها پیدا نکردم شاید هم هنوز موضوع زیاد برام مشخص نیست .
اگه میشه در مورد الگوریتم کار دستم نیومده یه توضیحی در این مورد .
اگر یه کد بهینه و خوب هم باشه ممنون میشم .
emad_67
شنبه 15 دی 1386, 10:31 صبح
تو بخش ساختمان داده ها یه جست و جو کن. زیاد در موردش صحبت شده. البته سورسی که با اشاره گر ها باشه نمیدونم هست یا نه ولی فکر کنم الگوریتم رو متوجه بشی
ICEMAN
شنبه 15 دی 1386, 13:24 عصر
سلام ... دیدم ولی همه سوال داشتن کسی راهنمایی مفیدی نکرده بود (با احترام به کسایی که سعی در راهنمایی داشتن)
rahgozare_abi
شنبه 15 دی 1386, 14:08 عصر
سلام دوست خوبم
به سه لینک زیر یک سری بزن ، کمکت می کنه
http://www.shoup.net/ntl/index.html
http://www.aachp.blogfa.com/cat-2.aspx
http://www.lahijancity.com/modules.php?name=Forums&file=viewtopic&p=381&highlight=
Nima_NF
شنبه 15 دی 1386, 18:29 عصر
ولی مثالی با Pointer ها پیدا نکردم شاید هم هنوز موضوع زیاد برام مشخص نیست خوب از انجایی که vector کار را راحت تر می کنند و جز استاندارد ها هم هستند ، بنابراین چه لزومی دارد که کار را برای خودمان سخت تر کنیم و مستقیما با pointer ها ایجاد کنیم؟
vector ها و سایر کلاس های مانند آن ، از همان اشاره گر ها استفاده کرده اند (و البته با همان قدرت کنترل)، دلیل شما برای استفاده از pointer ها چیست ؟
اگر کد بهینه می خواهید چرا از کتابخانه های open source که فراوان هم هستند ، استفاده نمی کنید :
مثل: big number library , NTL , apfloat , GMP
http://gmplib.org/ :GMP
http://www.shoup.net/ntl/index.html (http://www.shoup.net/ntl/index.html) :NTL
http://www.apfloat.org/ :apfloat
برای لیستی از سایر کتابخانه ها:
http://www.dmoz.org/Science/Math/Number_Theory/Software/
ICEMAN
شنبه 15 دی 1386, 19:20 عصر
vector ها و سایر کلاس های مانند آن ، از همان اشاره گر ها استفاده کرده اند (و البته با همان قدرت کنترل)، دلیل شما برای استفاده از pointer ها چیست ؟
Big Number library
سلام ... دلیل خاصی ندارم شاید فضولی ;)
بابت مثال ها هم ممنون من هنوز درگیر الگوریتم و نمونه کدهایی که از سایت گرفتم هستم
فک کنم هنوز کمی زود باشه برای این موضوعات
ICEMAN
شنبه 15 دی 1386, 22:58 عصر
با راهنمایی یکی از دوستان جمعش رو نوشتم ولی برای تفریق عددی مثل
92345 - 54329
یا ضرب و تقسیم اگه لطف کنید فقط راهنمایی کنید ممنون میشم تا خودم سعی کنم بنویسم
ICEMAN
یک شنبه 16 دی 1386, 09:14 صبح
اینو از یکی از پست های توی همین سایت گرفتم ولی جای Sample ش خالیه چون نتونستم باحاش کار کنم
این خطایی هست که میده ،توی VC++ 6
--------------------Configuration: HI - Win32 Debug--------------------
Compiling...
HI.Cpp
c:\program files\microsoft visual studio\vc98\include\stdio.h(82) : warning C4067: unexpected tokens following preprocessor directive - expected a newline
HugeInt.cpp
c:\program files\microsoft visual studio\vc98\include\stdio.h(82) : warning C4067: unexpected tokens following preprocessor directive - expected a newline
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(300) : error C2374: 'i' : redefinition; multiple initialization
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(294) : see declaration of 'i'
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(324) : error C2374: 'i' : redefinition; multiple initialization
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(294) : see declaration of 'i'
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(465) : error C2248: 'minusflag' : cannot access private member declared in class 'HugeInt'
c:\documents and settings\majid\desktop\hugnumber\hugeint.h(146) : see declaration of 'minusflag'
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(471) : error C2248: 'integer' : cannot access private member declared in class 'HugeInt'
c:\documents and settings\majid\desktop\hugnumber\hugeint.h(145) : see declaration of 'integer'
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(479) : error C2248: 'integer' : cannot access private member declared in class 'HugeInt'
c:\documents and settings\majid\desktop\hugnumber\hugeint.h(145) : see declaration of 'integer'
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(488) : error C2086: 'i' : redefinition
c:\documents and settings\majid\desktop\hugnumber\hugeint.cpp(493) : error C2593: 'operator >>' is ambiguous
Error executing cl.exe.
HI.exe - 7 error(s), 2 warning(s)
daniel1
یک شنبه 16 دی 1386, 19:22 عصر
سلام
ان شاء الله بتونم کمکتون کنم
آفرین بر شما که تابع جمعش رو نوشتین میتونیم با استفاده از اون بقبه رو بنویسیم
برای تفریق :
الگوریتمش شبیه به جمعه تفاوتش در منفی بودن عدد دوم یا اوله
باید توی همون تابع جمعتون اول ورودی رو چک بکنید اگه منفی بود به جای جمع اعداد تفریق بشند .کار درست اینه که یک تابع بنویسید که اعداد ورودی رو با هم مقایسه کنه هرکدوم بزگتر بود دیگری رو ازش کم کنه و اگه عدد دوم بزرگ تر بود موقع چاپ یه علامت منفی قبل از نتیجه چاپ بکنه .
daniel1
یک شنبه 16 دی 1386, 19:35 عصر
دیگر اینکه اگر بخواهید از اشاره گر ها استفاده بکنید یا اصلا بخواهید از victor ها استفاده نبرید پیشنهاد های من رو بخونید:
1) از string استفاده ببرید یعنی با ورودی نه به عنوان یک عدد بلکه به عنوان یک رشته برخورد بکنید این کار یک سری کمک های خوب به شما میکنه اول اینکه از توابه این فایل سرآیند میتونید بهره ببرید(مثلا برای تشخیص عدد بزرگتر ) دوم با کم کردن یک '0'از رشته ی مثلا 2 میتونید اون رو به عدد 2 تبدیل کنید . کار با این مورد مثل استفاده از آریه ای از کاراکترهاست فقط خیلی ساده تره.
2)استفاده از link list برای استفاده ی مستقیم از اشاره گر ها فقط یکم دردسرتون زیاد تر میشه.
3)استفاده از char * این مورد مثل مورد اوله فقط کار بیشتری می بره.
این برنامه رو این ترم به ما گفتند بنویسیم برای درس ساختمان داده برای همین روش خیلی فکر کردم خودم از مورد اول استفاده کردم و زودتر از همه تحویل دادم.
daniel1
یک شنبه 16 دی 1386, 19:54 عصر
برای تابع ضرب دو تا پیشنهاد دارم :
1)مثل ابتدایی که بهمون یاد دادن اول دونه دونه اعداد رو از عدد دوم در همه ی اعداد عدد دوم ضرب کنید و اعداد حاصله رو در یک آرایه از رشته ها ( یا هر جور دیگه ای که میدونید ) ذخیره کنید سپس با تابع جمعتون اونها رو با هم جمع کنید و نتیجه ی حاصله رو چاپ کنید .یادتون باشه که اگه عدد سوم از عدد دوم رو در اولی ضرب میکنید باید 2 تا صفر اول کار بگذارید.
2)این روش بدون تابع جمعه و در اون این دو تابع تلفیق میشن یعنی بعد از ضرب عدد اول از عدد دوم در همه ی اعداد عدد اول یک شیفت به چپ بکنید (عدد آخری از نتیجه هیچ وقت تغییر نمیکنه) و سری جدید اعداد رو با اعداد قبلی جمع و به جای اون ها در رشته ی جدید قرار بدید.این روش یکم بیشتر کار می بره اما در عوض استک مون آورفلو نمیشه من خودم از این روش استفاده کردم .
تابع ضرب رو که نوشتید بفرمائید تا براتون فاکتوریل رو توضیح بدم . اگه نتونستید هم بفرمائید تا یا راهنمایی بیشتری بکنم یا برنامه رو براتون ارسال کنم .
روی روش های دیگه هم فکر کید.
mhe93@yahoo.com
daniel1
یک شنبه 16 دی 1386, 20:02 عصر
و اما error ها :
اون قبلی توی ویژوال استادیو یه 2005 نوشته اما شما با c++ 6 یا بورلند کار کردید (البته این جور به نظر میرسه)
در ویژوال 2005 حوزه ی دید متغبر های دستور for فقط تا آخر دستوره اما در 6 این جور نیست و متغیر هر جایه تابع تعریف بشه حوزه ی دیدش تمام تابع (از تعریف به بعد ) هست برای همین به شما میگه قبلا i رو تعریف کردید . پیشنهاد میکنم i رو به q یا غیره (در موارد ایراد زا ) تغییر بدید .
ب تشکر
محمد حسین
ICEMAN
دوشنبه 17 دی 1386, 11:02 صبح
و اما error ها :
اون قبلی توی ویژوال استادیو یه 2005 نوشته اما شما با c++ 6 یا بورلند کار کردید (البته این جور به نظر میرسه)
در ویژوال 2005 حوزه ی دید متغبر های دستور for فقط تا آخر دستوره اما در 6 این جور نیست و متغیر هر جایه تابع تعریف بشه حوزه ی دیدش تمام تابع (از تعریف به بعد ) هست برای همین به شما میگه قبلا i رو تعریف کردید . پیشنهاد میکنم i رو به q یا غیره (در موارد ایراد زا ) تغییر بدید .
ب تشکر
محمد حسین
ممنون دوست عزیز از راهنمایی هاتون اون سورس و با DevC++ تونستم CompiE کنم ولی جالب اینجاست که تقسیم خیلی بد عمل می کنه
ممکنه اعداد اعشاری باشن برای این موضوع راهی به نظرتون میرسه ???
smile17
چهارشنبه 19 دی 1386, 07:42 صبح
سلام به دوستان
با تشکر از توجهتون به این موضوع
من چند تا پیشنهاد در این مورد دارم
1-در مورد تابع فاکتور به صورت زیر هم میشه عمل کرد ولی متاسفانه رو اعداد بزرگ جواب نمیده
http://sit.phpnet.us/fact.txt
2-میتونیم با استفاده از ریاضیات، مقدار تقریبی مثلا 502136 * 133652 رو بدست بیاریم و با استفاده از روش نماد علمی و تابع pow حاصل رو برگردونیم
در این صورت نتیجه ی برگشتی میتونه تا 10 به توان304 هم بزرگ باشه
ولی ایرادی که داره اینه که یه مقدار تقریب توی کار میآد
ICEMAN
چهارشنبه 19 دی 1386, 09:37 صبح
سلام تقریبا نوشتم ولی اعداد اعشاری و یه راهنمایی بکنید
daniel1
پنج شنبه 20 دی 1386, 22:29 عصر
با سلام مجدد
برای تقسیم :
میتونید از تفریق استفاده کنید برای اینکه جواب اعشار داشته باشید در پایان کار در خروجی / رو چاپ کنید .
من ساده تر از این به ذهنم نمیرسه راه هایدیگه ای هم هست .
راستی اگه ضرب رو کامل نوشتید بفرمائید تا براتون فاکتوریل رو بگذارم.
daniel1
پنج شنبه 20 دی 1386, 22:45 عصر
روی تقسیم بیشتر فکر کنید اگه طرحی به نظرتون رسید به ما هم بگید ممنون میشم.
ICEMAN
جمعه 21 دی 1386, 16:13 عصر
با سلام مجدد
برای تقسیم :
میتونید از تفریق استفاده کنید برای اینکه جواب اعشار داشته باشید در پایان کار در خروجی / رو چاپ کنید .
من ساده تر از این به ذهنم نمیرسه راه هایدیگه ای هم هست .
راستی اگه ضرب رو کامل نوشتید بفرمائید تا براتون فاکتوریل رو بگذارم.
منظورتون و واضح تر میگین
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.