PDA

View Full Version : سوال: تمامی حالات ممکن برای n متغیر بولی!!!



hstbt1372
دوشنبه 10 بهمن 1390, 13:25 عصر
همه اساتید خسته نباشید!
الگوریتمی برای ایجاد تمامی حالات n متغیر بولی می خواستم!!!
مثلا اگر n=2 چاپ کنه:
00
01
10
11
اگر یه راهنمایی کوچیک بکنین بقیه شو می نویسم
در ضمن اینم بگم که تو دل یه برنامه دیگه به همچین چیزی نیاز پیدا کردم. ممنون

shahmohammadi
دوشنبه 10 بهمن 1390, 15:16 عصر
سلام.
اگه n زیاد بزرگ نباشه می تونید با شمردن این کارو انجام بدید.
به این صورت که اگه مثلا سه تا متغیر داشته باشیم از خود "صفر" تا "یکی مونده به "دو به توان سه"" (یعنی تمام اعداد n بیتی) رو میشمریم. در هر قدم به بیت هاش نگاه می کنیم مقدار بیت اول رو به متغیر اول می دهیم، مقدار بیت دوم رو به متغیر دوم و به همین صورت به همه متغیر ها مقدار میدیم.
هر بار که به یک عدد می رسیم از روی اون عدد یک حالت رو بین متغیر ها می سازیم و در اون لحظه از اون حالت استفاده می کنیم که من توی اون قسمت در کد زیر فقط توضیح نوشتم.
#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
int count,Max;
int n,i,temp;
bool vars[16];
cout<<"Enter Number Of Members In Set:(<16) ";
cin>>n;

Max=(int)pow(2,n);
for(count=0;count<Max;count++)
{
temp=count;
for(i=0;i<16;temp/=2,i++)
if(temp%2==1)
vars[i]=1;
else
vars[i]=0;

//اکنون متغیر ها یک حالت را دارند و آماده استفاده اند
}
getch();
return 0;
}البته روش های دیگری هم می شه برای این مساله گفت که هر کدوم ویژگی های خودش رو دارد.

IamOverlord
دوشنبه 10 بهمن 1390, 15:28 عصر
با نوشتن تابع بازگشتی هم می شه این کارو کرد. که هر دفعه تابع خودشو با مقدار 0 و 1 فراخوانی کنه و ...

hstbt1372
دوشنبه 10 بهمن 1390, 15:48 عصر
واقعا ممنون!!!
اگر امکانش هست در مورد بازگشتی هم یه ذره بشتر توضیح بدین!!!

maktoom
دوشنبه 10 بهمن 1390, 17:01 عصر
سلام
بنظر من می تونید استفاده از دستورات شیفت بیتی رو(<< و >>) با روش بازگشتی که بهش اشاره شد ترکیب کنید. در اینصورت کد بهینه خواهید داشت.

hstbt1372
دوشنبه 10 بهمن 1390, 19:41 عصر
سلام.
اگه n زیاد بزرگ نباشه می تونید با شمردن این کارو انجام بدید.
به این صورت که اگه مثلا سه تا متغیر داشته باشیم از خود "صفر" تا "یکی مونده به "دو به توان سه"" (یعنی تمام اعداد n بیتی) رو میشمریم. در هر قدم به بیت هاش نگاه می کنیم مقدار بیت اول رو به متغیر اول می دهیم، مقدار بیت دوم رو به متغیر دوم و به همین صورت به همه متغیر ها مقدار میدیم.
هر بار که به یک عدد می رسیم از روی اون عدد یک حالت رو بین متغیر ها می سازیم و در اون لحظه از اون حالت استفاده می کنیم که من توی اون قسمت در کد زیر فقط توضیح نوشتم.
#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
int count,Max;
int n,i,temp;
bool vars[16];
cout<<"Enter Number Of Members In Set:(<16) ";
cin>>n;

Max=(int)pow(2,n);
for(count=0;count<Max;count++)
{
temp=count;
for(i=0;i<16;temp/=2,i++)
if(temp%2==1)
vars[i]=1;
else
vars[i]=0;

//اکنون متغیر ها یک حالت را دارند و آماده استفاده اند
}
getch();
return 0;
}البته روش های دیگری هم می شه برای این مساله گفت که هر کدوم ویژگی های خودش رو دارد.
البته i<n فکر کنم درستش میکنه

hstbt1372
دوشنبه 10 بهمن 1390, 20:35 عصر
بازگشتی شو نوشتم دوستان! اگر عیب و ایراد داره بفرمائید
#include <iostream>
#include <conio.h>
#include <math.h>

void print(int ,int );
void main()
{
int n;
cout<<"please enter number of array:";
cin>>n;
if(n>10)
cout<<"number is too big!!!";
else
{
long max=pow(2,n);
cout<<endl<<"all possible cases for "<<n<<" boolean variable is:"<<endl;
print(max,n);
}
getch();
}
void print(int max,int n)
{
if(max>0)
{
int temp=max;
for(int i=0;i<n;temp/=2,i++)
{
if(temp%2==1)
cout<<" 1 ";
else
cout<<" 0 ";
}
cout<<endl;
print(--max,n);
}
}
از همگی ممنون:قلب:

shahmohammadi
دوشنبه 10 بهمن 1390, 21:02 عصر
اولش به خاطه اینکه درکش راحت باشه به صورت زیر گفتم:

if(temp%2==1)
cout<<" 1 ";
else
cout<<" 0 ";
این بهینه تره:
cout<<temp%2;