把 2^n 个数 的 二进制保存起来就是真值表 ,然后根据输入的 F/T 筛选需要的真值表 ,最后 根据输入的 F / T筛选主范式,  T是极小项, F是极大项, 用 0,1处理比较好,最后输出转换一下就可以了。

// 把 2^n 个数 的 二进制保存起来就是真值表 ,然后根据输入的 F/T 筛选真值表
//最后 根据输入的 F / T  T是极小项, F是极大项, 用 0,1处理比较好,最后输出转换一下就可以了。  
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <cstdio>
using namespace std;
int n;
//sum 情况 a[sum] 二进制数, flag [2] -> true | false
//习惯 +1;
struct node
{
	int a[11000];
	int flag[2];
}aa[11000];
int main()
{

	cout<<"请输入变量个数:"; 
	cin>>n;
	//在 n 的基础上 控制数组的范围 
	int sum=pow(2,n),b[sum+1]={0};
	char zimu[30]; 
	char c[sum+1];//输入的字符 
	
	cout<<"请输入 "<<sum<<" 个字符(用T或F表示):"; 
	/*输入的字符转换成 0 1,*/
	for(int i=0;i<sum;i++)
	{
		cin>>c[i];
	}
	for(int i=0;i<sum;i++)
	{
		if(c[i]=='F') b[i]=0;
		else b[i]=1;
	}
	/* 
	for(int i=0;i<sum;i++)
		cout<<b[i]<<"\t";
	cout<<endl;
	*/
	/*转换结束*/
	
	/*把n个名字起个命题符号*/
	for(int i=0;i<n;i++)
	{
		zimu[i]='P'+i;	
	}
	
	/*把每个i 转换成 二进制数,aa[i].a[]就代表 i的二进制数
	  flag 代表每行 真值表出现的情况` 
	 */  
	for(int i=0;i<sum;i++)
	{//i 的 二进制数 
		int k=i;
		for(int j=0;j<n;j++)
		{
			int c=k%2;
			aa[i].a[j]=c;
			//cout<<aa[i].a[j]<<endl;
			k=k/2;
		}
		aa[i].flag[0]=0;
		aa[i].flag[1]=1;//为了 之后输入的筛选。
	}
	cout<<"请输出公式对应的真值表:"<<endl;
	/*输出真值表*/
	for(int i=0;i<n;i++)
	{
		cout<<zimu[i]<<"\t";
	}
	cout<<"A"<<endl; 
	for(int i=0;i<n;i++)
	{
		cout<<"————";
	}
	cout<<endl;
	for(int i=0;i<sum;i++)
	{
		for(int j=n-1;j>=0;j--)
		{
			cout<<(aa[i].a[j]==0?'F':'T')<<"\t";
		}
		cout<<(aa[i].flag[b[i]]==0?'F':'T');
		cout<<endl;
	}
	int flag1,flag2;
	//标记 最后一次出现极大项 极小项的位置  为了 ∧、∨ 
	for(int i=0;i<sum;i++) 
	{
		if(b[i]==1) flag1=i;//xiao
		if(b[i]==0) flag2=i; //da
	}
	/*b[i]==1 说明是 极小项,反之极大项*/
	/*主析取范式--> 极小项*/
	cout<<"请输出主析取范式:"<<endl;
	for(int i=0;i<sum;i++)
	{
		if(b[i]==0) continue;
		cout<<"< ";
		for(int j=n-1;j>=0;j--)
		{
			if(aa[i].a[j]==1)
//			cout<<(aa[i].a[j]==0?'F':'T');
			cout<<zimu[n-j-1]; // 因为 二进制是倒着输出的 所以 字母要反过来 
			else cout<<"┐"<<zimu[n-j-1];
			if(j!=0) cout<<"∧";
		}
		cout<<" >";
		if(i!=flag1) cout<<" ∨ ";
	 } 
	 cout<<endl<<endl;
	 /*主合取范式-->极大项*/
	cout<<"请输出主合取范式:"<<endl;
	for(int i=0;i<sum;i++)
	{
		if(b[i]==1) continue;
		cout<<"< ";
		for(int j=n-1;j>=0;j--)
		{
			if(aa[i].a[j]==0)
//			cout<<(aa[i].a[j]==0?'F':'T');
			cout<<zimu[n-j-1];
			else cout<<"┐"<<zimu[n-j-1];
			if(j!=0) cout<<" ∨ ";
		}
		cout<<" >";
		if(i!=flag2) cout<<" ∧ "; 
	 } 
	 return 0;
}

 

 


年轻也需要有所作为( ・´ω`・ )