PDA

View Full Version : کمک برای رفع اشکال کد



ehsan_faal
پنج شنبه 06 شهریور 1393, 02:30 صبح
سلام ،این کد قراره اعداد کامل رو پیدا کنه و مقصئم علیه هاشون رو هم جلوشون بنویسه ولی کار نمیکنه.
اگه ممکنه راهنماییم کنید.

#include<iostream>

using namespace std;
int GetDivisors(int,int[]);
bool Quite(int);
void printarray(int ,int []);
int main()
{
int n,counter;
bool ans;
cout<<"Ta chand: ";
cin>>n;
for (int i=2;i<=n;i++)
{
ans=Quite(i);
if (ans==1)
{
cout<<i<<" = ";
counter=GetDivisors(n,NULL);
int *Answer=new int[counter];
GetDivisors(n,Answer);
printarray(counter,Answer);
delete Answer;
}
}
return 0;
}
bool Quite(int m)
{
int sum=0,j;
for(j=(m/2)+1;j>=1;j--)
{
if(m%j ==0) sum+=j;
}
if (sum==m)
return true;
else
return false;
}
int GetDivisors(int m,int b[])
{
int sum=0,i=0,j;
for(j=(m/2)+1;j>=1;j--)
{
if(m%j ==0)
{
sum++;
if (b!=NULL)
{
b[i]=j;
i++;
}
}
}
return sum;
}
void printarray(int x,int a[])
{
int i;
for (i=0;i<x;i++)
{
cout<<a[i];
if (i<(x-1))
cout<<" +";
}
cout<<endl;
}

a.r.khoshghalb
پنج شنبه 06 شهریور 1393, 03:24 صبح
سلام
اتفاقا کد داره به بهترین نحو و بدون هیچ مشکلی کار می کنه!

مسعود اقدسی فام
پنج شنبه 06 شهریور 1393, 05:49 صبح
اشکال کد اینه که به جای

GetDivisors(n,NULL);
GetDivisors(n,Answer);

باید

GetDivisors(i,NULL);
GetDivisors(i,Answer);

نوشته بشه تا اعداد هم درست چاپ بشن. اما چرا سه بار الگوریتم تشخیص کامل بودن اجرا می‌شه؟ یه بار کامل بودن بررسی می‌شه، یه بار تعدادش محاسبه می‌شه و بار سوم مقسوم‌علیه‌ها رو به دست می‌یارید. این اصلا بهینه نیست. می‌شه همزمان با چک کردن مقسوم علیه، اعداد رو داخل یه list یا vector ذخیره کرد

ehsan_faal
پنج شنبه 06 شهریور 1393, 07:14 صبح
اشکال کد اینه که به جای

GetDivisors(n,NULL);
GetDivisors(n,Answer);

باید

GetDivisors(i,NULL);
GetDivisors(i,Answer);

نوشته بشه تا اعداد هم درست چاپ بشن. اما چرا سه بار الگوریتم تشخیص کامل بودن اجرا می‌شه؟ یه بار کامل بودن بررسی می‌شه، یه بار تعدادش محاسبه می‌شه و بار سوم مقسوم‌علیه‌ها رو به دست می‌یارید. این اصلا بهینه نیست. می‌شه همزمان با چک کردن مقسوم علیه، اعداد رو داخل یه list یا vector ذخیره کرد
مشکل من سر عبارتیه که قراره بهصورت حاصل جمع جلوی هر عدد کامل قرار بگیره.همیشه اخرین ارایه برای همه اعداد نشون داده میشه

ehsan_faal
پنج شنبه 06 شهریور 1393, 07:24 صبح
اشکال کد اینه که به جای

GetDivisors(n,NULL);
GetDivisors(n,Answer);

باید

GetDivisors(i,NULL);
GetDivisors(i,Answer);

نوشته بشه تا اعداد هم درست چاپ بشن. اما چرا سه بار الگوریتم تشخیص کامل بودن اجرا می‌شه؟ یه بار کامل بودن بررسی می‌شه، یه بار تعدادش محاسبه می‌شه و بار سوم مقسوم‌علیه‌ها رو به دست می‌یارید. این اصلا بهینه نیست. می‌شه همزمان با چک کردن مقسوم علیه، اعداد رو داخل یه list یا vector ذخیره کرد
میشه همین وکتور ولیستی رو که میگین یه قسمتی از کدشو بذارین،من تاحالا از این جلوتر نرفتم و این چیزا رو بلد نیستم.

مسعود اقدسی فام
پنج شنبه 06 شهریور 1393, 16:34 عصر
اگه همین تالار رو جستجو کنید توضیحاتش رو پیدا می‌کنید. اخیرا هم یه دوستی سوال کردن و یه لینک به عنوان توضیح آدرس داده شده.


http://barnamenevis.org/showthread.php?466812-vector-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F


به زبان ساده وکتور آرایه‌ی اندیس‌پذیری هست که می‌شه به صورت پویا عناصر رو از هر محل دلخواه درج یا حذف کرد. لیست هم کلاسی هست که همون مفهوم لیست پیوندی ساختمان‌داده‌ها پیاده‌سازی شده.

a.r.khoshghalb
پنج شنبه 06 شهریور 1393, 18:57 عصر
اشکال کد اینه که به جای

GetDivisors(n,NULL);
GetDivisors(n,Answer);

باید

GetDivisors(i,NULL);
GetDivisors(i,Answer);

نوشته بشه تا اعداد هم درست چاپ بشن. اما چرا سه بار الگوریتم تشخیص کامل بودن اجرا می‌شه؟ یه بار کامل بودن بررسی می‌شه، یه بار تعدادش محاسبه می‌شه و بار سوم مقسوم‌علیه‌ها رو به دست می‌یارید. این اصلا بهینه نیست. می‌شه همزمان با چک کردن مقسوم علیه، اعداد رو داخل یه list یا vector ذخیره کرد
حق با شماست! این اشکال بود ولی ندیدمش! بخاطر اینکه برنامه رو به این صورت تست کردم برای ورودی ("تا چند") اعداد کامل رو دادم و دیدم که داره درست کار می کنه! در حالی که اگر یکی بیشتر رو میدادم مشکل می خورد.