奎恩-麦克拉斯基化简法 (Q-M 法)化简逻辑代数式

2023-11-03 14:30

本文主要是介绍奎恩-麦克拉斯基化简法 (Q-M 法)化简逻辑代数式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《数字电子技术基础(第6版)》(阎石)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
极度暴力的模拟实现,不保熟的代码QAQ:

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
vector<int>vec[11],temp;
int a[100],head[11],tail[11],flag[1050];
int box[1050][100],ans[100][100];
int num[1050][11],now,last,q;
int ed[100],minn=0x3f3f3f,b[100],vis[100];void dfs(int x,int sum)
{if(sum>minn) return;if(x>cnt){for(int i=1;i<=cnt;i++){if(vis[i]){for(int j=1;j<=ans[i][0];j++)ed[ans[i][j]]=1;}}int ok=1;for(int i=1;i<=m;i++){if(!ed[a[i]]){ok=0;break;}}if(ok){memset(b,0,sizeof(b));q=0;minn=min(minn,sum);for(int i=1;i<=cnt;i++){if(vis[i]){b[++q]=i;}}}memset(ed,0,sizeof(ed));return;}vis[x]=1;dfs(x+1,sum+1);vis[x]=0;dfs(x+1,sum);return;
}int check(int x,int y)
{int cnt=0,pos=-1;for(int t=0;t<n;t++){if(num[x][t]==-1&&num[y][t]==-1) continue;if(num[x][t]==-1||num[y][t]==-1) return -1;if(num[x][t]^num[y][t]){if(!cnt) pos=t,cnt++;else return -1;}}return pos;
}
int main()
{cout<<"请输入变量数目:"<<endl;cin>>n;cout<<"请输入最小项数目:"<<endl;cin>>m;cout<<"请依次输入最小项序号:"<<endl;for(int i=1;i<=m;i++)scanf("%d",&a[i]);now=m,last=1;//计算每个最小项中1的个数for(int i=1;i<=m;i++){int t=a[i],cnt=0;int j=0;while(t){cnt+=(t%2);num[i][j++]=t%2;t>>=1;}vec[cnt].push_back(i);box[i][++box[i][0]]=a[i];}/*for(int i=0;i<=n;i++){tail[i]=vec[i].size();cout<<"vec["<<i<<"]:";for(int j=0;j<vec[i].size();j++)cout<<a[vec[i][j]]<<' ';cout<<endl;}*/int T=10;//合并最小项while(T--){for(int i=0;i<=n;i++){for(int j=head[i];j<tail[i];j++){for(int k=head[i+1];k<tail[i+1];k++){int pos=check(vec[i][j],vec[i+1][k]);{flag[vec[i][j]]=1,flag[vec[i+1][k]]=1;++now;a[now]=a[vec[i][j]];for(int t=0;t<=n;t++)num[now][t]=num[vec[i][j]][t];num[now][pos]=-1;for(int t=1;t<=box[vec[i][j]][0];t++)box[now][++box[now][0]]=box[vec[i][j]][t];for(int t=1;t<=box[vec[i+1][k]][0];t++)box[now][++box[now][0]]=box[vec[i+1][k]][t];vec[i].push_back(now);}}}head[i]=tail[i],tail[i]=vec[i].size();}}for(int i=1;i<=now;i++){if(!flag[i]){cout<<'P'<<++cnt<<":"<<endl;cout<<" 字母组合:";for(int j=n-1;j>=0;j--){if(num[i][j]==-1) cout<<"-";else cout<<num[i][j];}cout<<endl<<" 包含的最小项:"; for(int j=1;j<=box[i][0];j++)cout<<box[i][j]<<' ',ans[cnt][j]=box[i][j];ans[cnt][0]=box[i][0];cout<<endl;}}dfs(1,0);//求最小覆盖cout<<"最小项个数:"<<minn<<endl;cout<<"最小项组成:" ; for(int i=1;i<=q;i++)cout<<"P"<<b[i]<<' ';return 0;
}
//5
//11
//0 2 3 8 10 14 15 22 24 27 31

这篇关于奎恩-麦克拉斯基化简法 (Q-M 法)化简逻辑代数式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338820

相关文章

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

【Java编程的逻辑】原子变量 CAS 显示锁

原子变量 在理解synchronized中有使用synchronized保证原子更新操作,但是使用synchronized成本太高了,需要先获取锁,最后还要释放锁,如果获取不到锁还需要等到。这些成本都是比较高的,对于这种情况,可以使用原子变量。 Java并发包中的基本原子变量类型有以下几种: AtomicBoolean:原子Boolean类型,常用来在程序中表示一个标志位 AtomicIn

【Java编程的逻辑】容器类的总结

抽象容器类 用法和特点 容器类有两个根接口,分别是Collection 和 Map ,Collection表示单个元素的集合,Map表示键值对的集合 。 Collection Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也没有规定是否有重复元素。 List: 是Collection的子接口,表示有顺序或位置的数据集合,增加了根据

【Java编程的逻辑】堆与优先级队列PriorityQueue

完全二叉树 & 满二叉树 & 堆 基本概念 满二叉树是指除了最后一层外,每个节点都有两个孩子,而最后一层都是叶子节点,都没有孩子。 满二叉树一定是完全二叉树,但完全二叉树不要求最后一层是满的,但如果不满,则要求所有节点必须集中在最左边,从左到右是连续的,中间不能有空的。 特点 在完全二叉树中,可以给每个节点一个编号,编号从1开始连续递增,从上到下,从左到右 完全二叉树有一

【Java编程的逻辑】Map和Set

HashMap Map有键和值的概念。一个键映射到一个值,Map按照键存储和访问值,键不能重复。 HashMap实现了Map接口。 基本原理 HashMap的基本实现原理:内部有一个哈希表,即数组table,每个元素table[i]指向一个单向链表,根据键存取值,用键算出hash值,取模得到数组中的索引位置index,然后操作table[index]指向的单向链表。 存取的时候依据键的

MySQL逻辑架构和执行流程(一)

MySQL逻辑架构和执行流程 MySQL逻辑架构图第一层(连接层)第二层(核心服务层)第三层(存储引擎) 各组件详细介绍ConnectorsConnection PoolSQL_InterfaceParser解析器Optimizer优化器Cache和Buffer缓存Engine存储引擎 执行流程 MySQL 逻辑架构图 第一层(连接层) 连接层不是MYSQL架构特有的,

逻辑回归与线性回归的目标函数和应用场景比较

概述 逻辑回归和线性回归是两种常用的预测模型,它们在目标函数和应用场景上存在显著差异。本文将详细比较这两种回归模型,并提供相应的代码示例。 线性回归 线性回归是一种预测连续数值的模型,其目标是找到特征( X )和目标变量( Y )之间的线性关系。线性回归的目标函数是最小化预测值和实际值之间的平方差,即均方误差(MSE)。 目标函数 线性回归的损失函数是均方误差: [ J(\theta)

【python pytorch】Pytorch实现逻辑回归

pytorch 逻辑回归学习demo: import torchimport torch.nn as nnimport torchvision.datasets as dsetsimport torchvision.transforms as transformsfrom torch.autograd import Variable# Hyper Parameters input_si

两个月冲刺软考——逻辑地址与物理地址的转换(例题+讲解);文件类型的考点

1.已知计算机系统页面大小和进程的逻辑地址,根据页面变换表(页号-物理块号),求变换后的物理地址。 首先介绍几个公式: 逻辑地址 = 页号 + 页内地址 (默认为32机位) 物理地址 = 物理块号 + 物理地址的页内地址 其中:页内地址 = 物理地址的页内地址 解题:由于页面大小为4K,即4K=2的12次方,占0~11位;也就是页内地址有12位,故十六进制数中的C28是页内地址,那