مشکل:تابع جایگشت:(n-k+1)

mhabat

Member
با سلام.
یک تمرین هست که میگه:
موثرترین جایگشت تابع p(n,k)1فرمول زیر است:
کد:
p(n,k)=n(n-1)(n-2)..(n-k+1)
با استفاده از رابطه بالا یک برنامه بنویسید.
حالا من برنامه رو نوشتم اما نمی دونم مشکلش چیه :
کد:
#include<iostream.h>
#include<conio.h>
#include<math.h>
int fact(int x) {
int y=1;
for(;x>=1;x--)
y*=x;
return y; }
long perm2(int ,int);
 int main()
{ 
for (int i = -1; i < 8; i++)
{ for (int j= -1; j <= i+1; j++)
cout << " " << perm2(i,j);
cout << endl;
}
getch(); return 0;}
long perm2(int n, int k) {
if (n < 0 || k < 0 || k > n) return 0;
return fact(k)*fact(n-k+1);
}
فقط نمی خوام تابع mainتغیر کنه.
خیلی ممنون
بــدرود
 
آخرین ویرایش:

the_king

مدیرکل انجمن
با سلام.
یک تمرین هست که میگه:
موثرترین جایگشت تابع p(n,k)1فرمول زیر است:
کد:
p(n,k)=n(n-1)(n-2)..(n-k+1)
با استفاده از رابطه بالا یک برنامه بنویسید.
حالا من برنامه رو نوشتم اما نمی دونم مشکلش چیه

مشکل اش اینه که فرمول یک چیز دیگه میگه و شما یک چیز دیگه ای نوشتید.
شما از تابع فاکتوریل استفاده کرده اید، وقتی از تابع فاکتوریل استفاده می کنید،
از بزرگترین رقم تا 1 رو ضرب می کنید در حالی که قرار بود فقط تا n - k + 1 ضرب بشه.
اون تابع فاکتوریل fact رو حذف کنید که به درد این فرمول نمی خوره.
کد:
long perm2(int n, int k)
{
    if (n < 0 || k < 0 || k > n) return 0;
    long y = 1;
    for (int x = n; x >= n - k + 1; x--)
        y *= x;
    return y;
}
 

mhabat

Member
سلام.ممنون از پاسخ خوبتون.
یه برنامه دیگه هست که جایگشتش به شکل زیر:
کد:
C(n,k)=   n!
       ________
       k!(n-k)!
کدشم نوشتم .البته اینو دیگه از مدلی که تو خوده کتاب بود کمک گرفتم اما چرا جوابش درست در نمیاد؟
سورس:
کد:
#include<iostream.h>
#include<conio.h>
#include<math.h>
long fact(int n)
{  
if (n < 0) return 0;
int f = 1;
while (n > 1)
f *= n--;
return f;
}
long perm(int n, int k)
{  
if (n < 0 || k < 0 || k > n) return 0;
return fact(n)/(fact(k)*fact(n-k));
} 
int main()
{ 
for (int i = -1; i < 8; i++)
{ for (int j= -1; j <= i+1; j++)
cout << " " << perm(i,j);
cout << endl;
}
getch(); return 0;
}
ممنون
 

mahtab2009

Member
سلام
برنامه ایرادی نداره، فقط به جای " " در تابع main بنویس "t\"
اعتراف می کنم که من هم اولش بیخودی رفتم سر کار و داشتم دنبال ایراد برنامه می گشتم. :wink:
 

the_king

مدیرکل انجمن
سلام.ممنون از پاسخ خوبتون.
یه برنامه دیگه هست که جایگشتش به شکل زیر:
کد:
C(n,k)=   n!
       ________
       k!(n-k)!
کدشم نوشتم .البته اینو دیگه از مدلی که تو خوده کتاب بود کمک گرفتم اما چرا جوابش درست در نمیاد؟
ممنون
از کامپایلر 16 بیتی استفاده می کنید؟ فاکتوریل همون 8 ناقابل هم عدد بزرگی مثل 40320 است،
f را باید long تعریف کنید، نه int وگرنه fact مقدار اشتباهی بر می گرداند.
کد:
int f = 1;
 

mhabat

Member
والا بیتشو نمی دونم.اما از توربو و devاستفاده می کنم.
اون برنامه اولیهP(n.k)gرو که گفتین فاکتوریل اشتباه رو باید چی کار کنم آخه یه برنامه گفته که به شکل زیر باید باشه:
کد:
a(n,k)=P(n,k)
       ______
       k!
سورسشو ببینید:
کد:
#include<iostream.h>
#include<conio.h>
long perm2(int n, int k)
{
    if (n < 0 || k < 0 || k > n) return 0;
    long z,y = 1;
    for (int x = n; x >= n - k + 1; x--)
 y *= x;
 z=y/fact(k);
 return z;
}
 int main()
{ 
for (int i = -1; i < 8; i++)
{ for (int j= -1; j <= i+1; j++)
cout << " " << perm2(i,j);
cout << endl;
}
getch(); return 0;}
 

the_king

مدیرکل انجمن
والا بیتشو نمی دونم.اما از توربو و devاستفاده می کنم.
اون برنامه اولیهP(n.k)gرو که گفتین فاکتوریل اشتباه رو باید چی کار کنم آخه یه برنامه گفته که به شکل زیر باید باشه:
کد:
a(n,k)=P(n,k)
       ______
       k!

این perm2 شما بالاخره (P(n, k است یا (A(n, k ؟ اگر فرمول اینه :
کد:
P(n,k)=n(n-1)(n-2)..(n-k+1)
اینجا فاکتوریلی نیست و fact کاربردی نداره.

اگر هم فرمول اینه :
کد:
A(n,k) = P(n,k) / k!
اون تقسیم بر (fact(k را اضافه کنید.
 

mhabat

Member
ممنون خودمم یکمی قاطی کردم اما در کل درستش کردم.
تو این تایپک تمرین هایی رو که گفتم تا یه جاها یی شو تونستم حل کنم اما تمرین زیر رو نتونستم متسفانه.
تمرین:تابع زیر رو:
کد:
C(n,k) =((((((n /1)(n -1)) / 2)(n - 2)) /3)...(n - k + 2)) /(k -1))(n - k +1))/k
در تابع mainمثال پست قبل به کار ببرید.
فقط میگم این پست هایی که توشون تمرین دادم مرتبط هستند با موضوع تایپ دیگه ...!
خیلی ممنون از The _kingوmahtab2009
 

the_king

مدیرکل انجمن
ممنون خودمم یکمی قاطی کردم اما در کل درستش کردم.
تو این تایپک تمرین هایی رو که گفتم تا یه جاها یی شو تونستم حل کنم اما تمرین زیر رو نتونستم متسفانه.
تمرین:تابع زیر رو:
کد:
C(n,k) =((((((n /1)(n -1)) / 2)(n - 2)) /3)...(n - k + 2)) /(k -1))(n - k +1))/k
در تابع mainمثال پست قبل به کار ببرید.
فقط میگم این پست هایی که توشون تمرین دادم مرتبط هستند با موضوع تایپ دیگه ...!
خیلی ممنون از The _kingوmahtab2009

برای اینجور مسائل روال سری رو بدست بیارید، مثلا ببینید در صورت کسر ها چه تغییری رخ میده، بعد ببینید
در مخرج کسر چه تغییری رخ میده، بعد یک متغیر حلقه بنویسید و در صورت و مخرج کسر ازش استفاده کنید.

صورت کسر ها :
کد:
n, n - 1, n - 2, ..., n - k + 2, n - k + 1

n همون n - 0 است و n - k + 1 همون (n - (k - 1 پس :
کد:
n - 0, n - 1, n - 2, ..., n - (k - 2), n - (k - 1)

در صورت کسر ها n تغییری نمی کنه، صرفا ارقام 0 الی k - 1 ازش کسر میشه.
یک متغیر حلقه با نام i خواهیم داشت که از 0 الی k - 1 را بشماره :
کد:
    for (int i = 0; i < k; i++)

و صورت کسر رو با فرمول زیر بدست بیاره :
کد:
n - i

مخرج کسر ها هم اعداد 1 الی k هستند که با توجه به مقدار متغیر i از فرمول زیر بدست می آیند :
کد:
i + 1

پس کسر چنین خواهد بود :
کد:
(n - i) / (i + 1)

کد:
float C(int n, int k)
{
    float c = 1;
    for (int i = 0; i < k; i++)
        c *= (n - i) / (i + 1);
    return c;
}
 

mhabat

Member
سلام.برای متغیر cاز longاستفاده کردم اما چرا فاکتوریل بعضیاش میشه صفر؟
سورس:
کد:
#include<iostream.h>
#include<conio.h>
float C(int n, int k)
{
    long int c=1;
    for (int i = 0; i < k; i++)
        c *= (n - i) / (i + 1);
    return c;
}
 int main()
{ 
for (int i = -1; i < 8; i++)
{ for (int j= -1; j <= i+1; j++)
cout << " " << C(i,j);
cout << endl;
}
getch(); return 0;}
.آخرین تمرینش میگه همین تابع C(n.k)1رو در یک مثاث خیام12ردیفی چاپ کنید.
روم به دیوار سورس شو نوشتم اما خیلی نابود اجرا میشه.
کد:
#include<iostream.h>
#include<conio.h>
float C(int n, int k)
{
    long int c=1;
    for (int i = 0; i < k; i++)
        c *= (n - i) / (i + 1);
    return c;
}
 int main()
{ 
for (int i = 0; i < 12; i++)
{ for (int j= 0; j < 12; j++)
cout << " " << C(i,j);
cout << endl;
}
getch(); return 0;}
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا