PDA

View Full Version : مبتدی: مشکل این کد کجاست؟



ehsan_faal
پنج شنبه 12 تیر 1393, 14:05 عصر
سلام.من اید برنامه رو نوشتم که بهم اولین جمله با تعداد رقم دلخواه از دنباله فیبوناچی رو بده.چرا کار نمیکنه.(در ضمن جواب پیچیده ندید لطفا،هنوز زیاد بلد نیستم:خجالت:)
در ضمن اگه بخوام مثلا 5امین جمله 3 رقمی رو پیدا کنم چی؟

#include <iostream>

using namespace std;
long int fibonacci(long int);
int calculate_digits(long,int,int);

int main()
{
cout<<"avvalin fibonacci ba tedad arqam e x ra peyda kon:\n";
int y;
cin>>y;
int raqam ,fib,i ,j,x=1;
for (i=1;i<=y;i++)
{
x*=10;
}
for (j=0;j<=50;j++)
{
fib=fibonacci(j);
raqam=calculate_digits(fib,x,j);
if (raqam==0)
{
cout<<"jomleye "<<j<<" om"<<"\n"<<"meqdar e jomle = "<<fib;
break;
}
}
system("pause");
}
long int fibonacci(long z)
{
if (z==1|z==0)
{
return z;
}
else
{
return fibonacci(z-1)+fibonacci(z-2);
}
}
int calculate_digits(long fib,int x,int j)
{
if (fibonacci(j)/x==0 && fibonacci(j+1)/x!=0)
{
return 1;
}
else
{
return 0;
}
}

ehsan_faal
پنج شنبه 12 تیر 1393, 14:52 عصر
این رو هم نوشتم ولی به ذهنم نمیرسه چه جوری مشکلشو حل کنم!

#include <iostream>

using namespace std;
long int fibonacci(long int);

int main()
{
cout<<"avvalin fibonacci ba tedad arqam e x ra peyda kon:\n";
int y;
cin>>y;
int i ,j;
long fib;
for (j=0;j<=50;j++)
{
int x=1;
fib=fibonacci(j);
for (i=1;i<=y;i++)
{
x*=10;
if (fib/x==0 && i==y)
{
cout<<"\n"<<"jomleye morede nazar,jomleye "<<j<<" om e donbale mibashad\n"<<"Meqdare an barabar ast ba= "<<fib<<endl;
break;
}
}
}
system("pause");
}
long int fibonacci(long z)
{
if (z==1|z==0)
{
return z;
}
else
{
return fibonacci(z-1)+fibonacci(z-2);
}
}

مسعود اقدسی فام
پنج شنبه 12 تیر 1393, 14:54 عصر
کد که اصلا بهینه نیست و اصلاح زیادی لازم داره. اما اگه همینجوری هم می‌خواید کار کنه ...

تابع calculate_digits اگه تعداد رقم‌ها به حد مطلوب برسه عدد یک رو بر می گردونه و اگه کوچکتر باشه صفر. اما تابع اصلی ازش برعکس استفاده کردید.

فعلا همین رو متوجه شدم من.

مسعود اقدسی فام
پنج شنبه 12 تیر 1393, 15:13 عصر
این رو هم نوشتم ولی به ذهنم نمیرسه چه جوری مشکلشو حل کنم!

#include <iostream>

using namespace std;
long int fibonacci(long int);

int main()
{
cout<<"avvalin fibonacci ba tedad arqam e x ra peyda kon:\n";
int y;
cin>>y;
int i ,j;
long fib;
for (j=0;j<=50;j++)
{
int x=1;
fib=fibonacci(j);
for (i=1;i<=y;i++)
{
x*=10;
if (fib/x==0 && i==y)
{
cout<<"\n"<<"jomleye morede nazar,jomleye "<<j<<" om e donbale mibashad\n"<<"Meqdare an barabar ast ba= "<<fib<<endl;
break;
}
}
}
system("pause");
}
long int fibonacci(long z)
{
if (z==1|z==0)
{
return z;
}
else
{
return fibonacci(z-1)+fibonacci(z-2);
}
}

با توجه به این که y‌ اول برنامه گرفته می‌شه و ثابت هست، هیچ لزومی نداره برای هر جمله مقدار x رو که توان yام عدد ده هست دوباره محاسبه کنید. مقدار x ثابت هستش دیگه. مثل همون کد اولتون. اون شرط بررسی تعداد ارقام هم اینجا صحیح نوشته نشده.

ehsan_faal
پنج شنبه 12 تیر 1393, 15:26 عصر
تقریبا درستش کردم،فقط اگه بخوام یکم بهترش کنم و مثلا 5امین جمله 7رقمی رو بگیرم،میشه یکم راهنماییم کنید.

#include <iostream>
using namespace std;
long fibonacci(int);
int digits(long);
int main()
{
long fib;
int y,z;
cout<<"Donbale jomle E az donbaleye fibonacci ba chan raqam hastid? \n Pasokhe shoma: ";
cin>>y;
for (int j=1;j<=50;j++)
{
fib=fibonacci(j);
z=digits(fib);
if (z==y)
{
cout<<"shomareye jomle = "<<" "<<j<<" Va meqdare an = "<<fibonacci(j)<<endl;
break;
}
else
{
continue;
}
}
system("pause");
}
long fibonacci(int x)
{
if (x==0|x==1)
{
return x;
}
else
{
return fibonacci(x-1)+fibonacci(x-2);
}
}
int digits(long fib)
{
int x=1;
for (int i=1;i<=50;i++)
{
x*=10;
if (fib/x==0)
{
return i;
}
}
}

مسعود اقدسی فام
پنج شنبه 12 تیر 1393, 15:52 عصر
تقریبا درستش کردم،فقط اگه بخوام یکم بهترش کنم و مثلا 5امین جمله 7رقمی رو بگیرم،میشه یکم راهنماییم کنید.


برای این کار باید یه شمارنده به برنامه اضافه کنید. هر وقت که تعداد ارقام به حد مطلوب رسید، هر کدوم رو که پیدا کرد به جای چاپ کردن فقط به شمارنده یه واحد اضافه کنه. هر وقت شمارنده به عدد دلخواه رسید یعنی اون چیزی که خواستید (مثلا پنجمین هفت رقمی) پیدا شده.
البته توجه داشته باشید که ممکنه اصلا خروجی نداشته باشه! یعنی مثلا ده تا عدد هفت رقمی فیبوناچی نداریم که شما دهمی رو بخواید چاپ کنه. پس باید این شرط هم بررسی بشه.
در ضمن روش محاسبه‌ی شما برای دنباله‌ی فیبوناچی (بازگشتی) کارا نیست. برنامه رو یه بار با ورودی y = 5 و یه بار با ورودی y = 10 امتحان کنید و مدت زمان اجرای برنامه رو مقایسه کنید. مشکل رو با راهنمایی این لینک حل کنید:


http://algorithmha.ir/post-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%D9%88%DB%8C%D8%A7.aspx