PDA

View Full Version : کمک برای پیدا کردن اعداد کامل خیلی بزرگ



ehsan_faal
سه شنبه 21 مرداد 1393, 19:03 عصر
سلام.من این کد رو نوشتم تا واسم اعداد کامل رو پیدا کنه ولی محدودیت داره.کسی میتونه کمک کنه که این محدودیت رو وردارم؟

#include<iostream>
#include <iomanip>
using namespace std;
void main()
{
unsigned long int j, i;
const int arraySize = 100;
for (j = 1; j <= 1e5; j++)
{
int k ;
int flag = 0;
int a[arraySize] = { 0 };
int sum = 0;
for (i = 1; i <= (j / 2) + 1; i++)
{
if (j%i == 0)
{
++flag;
sum += i;
a[flag]= i;
}
}
if (sum == j)
{
cout << j << " = ";
for (k = 1; k <= flag; k++)
{
if (k == flag)
cout << a[k] << endl;
else
cout<< a[k] << " + " ;
}
cout << endl;
}
}
}
با تشکر

مسعود اقدسی فام
سه شنبه 21 مرداد 1393, 19:41 عصر
اگه منظورتون از لحاظ سرعت هست که می‌شه بهینه‌تر عمل کرد. مثلا اینکه هر مرحله چک کنید که اگه sum بیشتر از خود عدد شده باشه دیگه ادامه نده و سراغ عدد بعدی بره. یا اینکه اول از نصف عدد شروع کنید و به سمت پایین حرکت کنید. اینطوری مجموع مقسوم‌علیه‌ها سریع‌تر به خود عدد نزدیک‌تر می‌شه و اگه ازش رد بشه زودتر تشخیص می‌دید.
یا به جای آرایه‌ی ثابت از vector یا list‌ استفاده کنید. در مورد این مساله list بهتر هم هست. چون فقط با مجموعه‌ای از اعداد پر می‌شه و در انتها با یه پیمایش از اول تا آخر چاپ می‌شه. در واقع نیازی به اندیس‌دار بودن ندارید.

ehsan_faal
سه شنبه 21 مرداد 1393, 19:54 عصر
اگه منظورتون از لحاظ سرعت هست که می‌شه بهینه‌تر عمل کرد. مثلا اینکه هر مرحله چک کنید که اگه sum بیشتر از خود عدد شده باشه دیگه ادامه نده و سراغ عدد بعدی بره. یا اینکه اول از نصف عدد شروع کنید و به سمت پایین حرکت کنید. اینطوری مجموع مقسوم‌علیه‌ها سریع‌تر به خود عدد نزدیک‌تر می‌شه و اگه ازش رد بشه زودتر تشخیص می‌دید.
یا به جای آرایه‌ی ثابت از vector یا list‌ استفاده کنید. در مورد این مساله list بهتر هم هست. چون فقط با مجموعه‌ای از اعداد پر می‌شه و در انتها با یه پیمایش از اول تا آخر چاپ می‌شه. در واقع نیازی به اندیس‌دار بودن ندارید.
بعد اگه بخوام تا اعداد بیشتری رو چک کنم چی؟

مسعود اقدسی فام
چهارشنبه 22 مرداد 1393, 11:24 صبح
اول اینکه بهتر هست همونطور که اینجا کد نوشتید از کوچک شروع کنید و به سمت بزرگتر حرکت کنید. فقط به جای اینکه فقط خود عدد رو به لیست اضافه کنید، حاصل تقسیم رو هم اضافه کنید. یعنی مثلا برای عدد 1000 وقتی 2 رو بررسی می کنید 500 رو هم اضافه کنید. یا برای 4 عدد 250 رو هم اضافه کنید. این کار دو تا حسن داره. اول اینکه همون حالت اضافه شدن اعداد بزرگ هم اتفاق می افته و اگه مجموع بیش از خود عدد باشه سریعتر متوجه می شید. دوم اینکه مثلا وقتی عدد 250 اضافه می شه دیگه مطمینن هستید که مقسوم علیه های بزرگتر از 250 هم قبلا اضافه شدن و دیگه نیازی نیست چک کردن اعداد رو بیشتر از 250 ادامه بدید. وقتی تقسیم بر 5 انجام می دید و 200 نتیجه می شه حتی لازم نیست تا خود 250 هم پیش برید! چون مطمین هستید بین 200 و 250 مقسوم علیه جدیدی وجود نداره. و همینطور وقتی به 8 می رسید دیگه نیازی نیست بیشتر از 125 رو بررسی کنید. اینطوری در عمل بازه جستجو خیلی کمتر و سرعت خیلی بالاتر می ره
در مورد چک کردن اعداد خیلی بزرگ هم unsigned long long رو امتحان کنید. اگه خیلی بزرگتر منظورتونه کلاسای مخصوص کار با اعداد خیلی بزرگ طراحی و منتشر شده که قابل استفاده هستن