سلام به همه دوستان و سروران گرامی. می خواستم یه پروژه بزرگی رو راه اندازی کنم گفتم اینجا مطرح کنم تا توسط همه دوستان پیگیری بشه و إن شاءالله به یه نتیجه خوب برسه. اول از همه بگم که پروژه به زبان وی بی هستش.
می خواهیم اعدادی رو با 2 الی 3 میلیون رقم دریافت کنیم و سپس بررسی کنیم که این عدد اول هست یا نه ( به همین سادگی! البته یه بخشی از کار واقعا ساده است. ولی یه بخش دیگه اش سخت میشه و سختی اش هم به خاطر حجم زیاد کاره) اگر مایل هستید، توضیحات بیشتر رو ارائه بدم تا پروژه رو کلید بزنیم. هر کی مرد این میدونه یا علی همین جا اعلام بکنه.
![]()
![]()
تو به آفتاب مانی به کمال حسن و طلعت / که نظر نمی تواند که ببیندت که ماهی
اللهم عجل لولیک الفرج![]()
دوست آشنا
ارام تر سکوت کن : ... !
صدای بی تفاوتی هایت ازارم می دهدکلاس های برنامه نویسی ( اموزش )
کلاس های برنامه نویسی سایت ( اطلاعیه )
دوست آشنا
از وی بی چیزی نمیدونم ................. ولی امیدوارم این 3 جمله زیر بدرد بخوره ......................
عدد اول عددی است که فقط بر یک و خودش قابل تقسیم باشد .
هر عدد مرکب n دارای حداقل یک مقسوم علیه اول کوچکتر یا مساویاست. (پس برای فهمیدن اینکه عدد اول هست یا نه ، میشه از عکس این موضوع استفاده کرد)
اگر n عددی طبیعی و بزرگتر از 2 باشد, حتما" بین n و 2n عدد اولی وجود دارد.
موفق باشید![]()
به دنبال کسی جامانده از پرواز می گردم / مگر بیدار سازد غافلی را غافلی دیگر
دوست آشنا
با سلام به دوست گلم »
عدد اول مشخص هست چی هست ولی چون عدد میلیونی هست و میلیاردی یک زمان میبره
باید یک راهی پیدا کرد که بشه عدد رو بدون این همه حساب کردن بدست اورد
به عنوان مثال اگه بخوایم عدد 7 رو ببینیم اوله یا نه باید از عدد 2 شروع کنیم به تقسیم کردن تا باقی ماندش 0 بشه
و چون فقط به خودش تقسیم میشه و باقی ماندش 0 میشه عدد اول هست
چون اندازه ی حلقمون زیاد هست باید دنبال ساده ترین راه حل گشت که بالاترین سرعت رو داشته باشه
نظر من اینه که برای اعداد بالاتر از 2 رقم بر 4 عدد 2 و 3 و 5 و 7 تقسیم کنیم اگه تقسیم شد که عدد اول نیست ولی اگه بر این4 تا عدد تقسیم نشد
ولی بازم حساب میکنم این روش من مشکلاتی داره فقط مشکلش وقتی هست که یک عدد اول ضرب در یک عدد اول بشه
به عنوان مثال 11*11 که میشه 121 حالا 121 رو اگر بر این 4 تا عدد تقسیم کنیم میشه اول ولی در صورتی که اول نیست چون به جز خودش بر 11 هم تقسیم میشه
ارام تر سکوت کن : ... !
صدای بی تفاوتی هایت ازارم می دهدکلاس های برنامه نویسی ( اموزش )
کلاس های برنامه نویسی سایت ( اطلاعیه )
کاربر اخراج شده
دوست آشنا
ارام تر سکوت کن : ... !
صدای بی تفاوتی هایت ازارم می دهدکلاس های برنامه نویسی ( اموزش )
کلاس های برنامه نویسی سایت ( اطلاعیه )
میشه بیشتر توضیح بدی ؟
دوستان من فکر این رو کردم. می تونیم از 10 شروع کنیم یعنی اعداد اول کوچکتر از ده رو داریم و داخل دیتابیس ذخیره می کنیم. بعد اعداد بزرگ تر از 10 رو به اعداد اول کوچکتر از 10 تقسیم می کنیم. اگر بخش پذیر نبود ان عدد اول است و به لیست اعداد اول اضافه می شود. در مرحله بعدی باید به اعداد اولی که توی لیست هست تقسیم بشه. همین جور این لیست بزرگ و بزرگ تر میشه و به اون نتیجه دلخواه می رسیم. یعنی پیدا کردن یه عدد اول در حد میلیون رقم. تازه در رقم های بالا می تونیم از قواعد بخش پذیری استفاده کنیم که خیلی آسونتر هستند. مثلا اگر رقم آخر عدد زوج بود بر 2 بخش پذیر است و لازم نیست که خودمون و کامپیوتر رو برای یک تقسیم میلیاردی خسته کنیم. به طور کلی در هر 1000 عدد متوالی مخصوصا در ارقام بالا حدود سه چهارم اعداد(البته محاسبه دقیق نکردم. سر انگشتیه) رو می شه با قواعد ساده بخش پذیری اوت کرد. ولی مشکل اصلی من این نیست. مشکل اینه که از حافظه کامپیوتر برای محاسبه و نگهداری این اعداد نمی شه استفاده کرد(حداکثر 40 رقم) و باید اون ها رو رشته کرد و محاسبات رو رشته ای انجام داد. می خوام به کمک هم یه کلاس تعریف کنیم که این کارو انجام بده.
ویرایش توسط mpkahkeshan : 29th February 2012 در ساعت 01:15 PM
تو به آفتاب مانی به کمال حسن و طلعت / که نظر نمی تواند که ببیندت که ماهی
اللهم عجل لولیک الفرج![]()
همکار تالار برنامه نویسی
سلام
همون طور که گفتم، وی بی حرفه ای نمیدونم. اما برای الگوریتمش میتونیم باهم پیش بریم.
دربرنامه نویسی دقیقا از دو نکته اول و دوم تون باهم استفاده میشه.
کاملا این دونکته کاربردیه.
اما نکته آخر را تا حالا نشنیده بودم یا اینکه یادم رفته... خیلی جالبه.
اینکه فقط به یه سری اعداد خاص تقسیمشون کنیم همه اعداد اول را برامون تولید نمیکنه. باید کاملا بدون محدودیتِ تعداد عناصر چک شده پیش بریم.
درسته .
اما میشه به همه اعداد تقسیم کرد به جای تقسیم به عوامل اول.
چون پیدا کردن اعداد اول خودش برای ما سواله.
میشه برای کاهش هزینه اجرا تا یکی مانده به آخری پیش نرویم. تا n/2 امین عنصر پیش بریم. (طبق نکته 2 جناب radical 1111)
نظر من:
فکر نکنم کاری به جز روال عادی وجود داشته باشه.
یعنی تقسیم به همه ی عوامل که دربازه ی [n,n/2] قرار گرفتند و درصورت یک شدن باقی مانده یکی از این تقسیم ها قطع ادامه کار و اعلام مرکب بودن آن. در غیر این صورت اعلام اول بودن آن.
این یعنی باید به اندازه ی نصف عدد حلقه بزنیم.(که این از نظر هزینه بده)
یه کار دیگه اینکه پیش پردازش را پیچیده کنیم اما عوضش هزینه پاسخ سریع بشه!
این طوری:
اگه بدانیم حداکثر عددm میتواند دریافت شود، همه اعداد اول تا اون نقطه را به همون روش بالا بدست بیاریم و به شکل دسته بندی شده ذخیره کنیم .
با استفاده از Hash دسترسی بهشون را آسان و سریع کنیم.
یعنی وقتی از من پرسیده شده آیا عدد k اول است من نمیام حساب کنم آیا این اوله یا نه ، میام به جدول Hashing مراجعه میکنم ببینم اونجا نوشته شده یا نه. یعنی فقط هزینه ی تابع Hash را داریم . زمان اجرا خیلی کم میشه اما هزینه پیش پردازش بالا.
اگه وی بی Hash نداشته باشه هم مهم نیشت بازم میشه به شیوه های جالب دیگه فقط اعداد اول را ذخیره کرد و زمان پرسش کاربر آماده بهش جواب داد.
همکار تالار برنامه نویسی
برای نوشتن کلاسی که لازم داریم می تونیم از شما کمک بگیریم. واقعاً خوشحال می شم اگر شما هم مارو همراهی کنیدخب پس شما مشکل الگوریتم ندارید.
آره منم دقیقا به همین موضوع داشتم فکر میکردم.
فکر خوبیه.
پس از اینجا به بعد (نوشتن کد) کار من نیست.(وی بی بلد نیستم
)
موفق باشید![]()
![]()
تو به آفتاب مانی به کمال حسن و طلعت / که نظر نمی تواند که ببیندت که ماهی
اللهم عجل لولیک الفرج![]()
در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)
علاقه مندی ها (Bookmarks)