当前位置: 首页 > 编程笔记 >

基于DFA的部门

狄易安
2023-03-14
本文向大家介绍基于DFA的部门,包括了基于DFA的部门的使用技巧和注意事项,需要的朋友参考一下

确定性有限自动机(DFA)用于检查一个数字是否可被另一个数字k整除。如果不能整除,则此算法还将找到余数。

对于基于DFA的部门,首先,我们必须找到DFA的过渡表,使用该表,我们可以轻松找到答案。在DFA中,每个状态只有两个过渡0和1。

输入输出

Input:
The number: 50 and the divisor 3
Output:
50 is not divisible by 3 and remainder is: 2

算法

dfaDivision(num, k)

输入: 数字num和除数k。

输出:检查除数和余数。

Begin
   create transition table of size k * 2 //2 for transition 0 and 1
   state = 0
   checkState(num, state, table)
   return state
End

checkState(num,state,table)

输入: 数字num,状态和转换表。

输出: 执行除法后更新状态。

Begin
   if num ≠ 0, then
      tempNum := right shift number for i bit
      checkState(tempNum, state, table)
      index := number AND 1 //perform logical and with number and 1
      state := table[state][index]
End

示例

#include <iostream>
using namespace std;

void makeTransTable(int n, int transTable[][2]) {
   int zeroTrans, oneTrans;

   for (int state=0; state<n; ++state) {
      zeroTrans = state<<1;   //next state for bit 0
      transTable[state][0] = (zeroTrans < n)? zeroTrans: zeroTrans-n;

      oneTrans = (state<<1) + 1;    //next state for bit 1
      transTable[state][1] = (oneTrans < n)? oneTrans: oneTrans-n;
   }
}

void checkState(int num, int &state, int Table[][2]) {
   if (num != 0) {    //shift number from right to left until 0
      checkState(num>>1, state, Table);
      state = Table[state][num&1];
   }
}

int isDivisible (int num, int k) {
   int table[k][2];    //create transition table
   makeTransTable(k, table);    //fill the table
   int state = 0;    //initially control in 0 state
   checkState(num, state, table);
   return state;    //final and initial state must be same
}

int main() {
   int num;
   int k;
   cout << "Enter Number, and Divisor: "; cin >> num>> k;
   int rem = isDivisible (num, k);
   if (rem == 0)
      cout<<num<<" is divisible by "<<k;
   else
      cout<<num<<" is not divisible by "<<k<<" and remainder is: " << rem;
}

输出结果

Enter Number, and Divisor: 50 3
50 is not divisible by 3 and remainder is: 2
 类似资料:
  • 由来 在我最早入职的一家公司,主要负责内容方面的业务,对我来说大部分的工作是对内容的清洗和规整。当然,清洗过程免不了的就是按照关键词过滤,你懂的。需求如下: 后台人员添加N个关键字,然后对主站所有的内容进行清洗,含有这些关键字的所有内容都置为无效。 思路 拿到此需求,我最早的方案比较粗暴:针对关键字建立一个HashSet,然后遍历整个数据库,针对每篇文章遍历这个Set,查找是否contains关键

  • 本文向大家介绍Regular Expressions DFA,包括了Regular Expressions DFA的使用技巧和注意事项,需要的朋友参考一下 示例 输入驱动DFA(确定性有限自动机)引擎。 原理 该算法扫描输入字符串一次,并记住正则表达式中所有可能匹配的路径。例如,当模式中遇到交替时,将创建两个新路径并独立尝试。如果给定路径不匹配,则将其从可能性集中删除。 含义 匹配时间受输入字符串

  • 使用 1. 构建关键词树 WordTree tree = new WordTree(); tree.addWord("大"); tree.addWord("大土豆"); tree.addWord("土豆"); tree.addWord("刚出锅"); tree.addWord("出锅"); 2. 查找关键词 //正文 String text = "我有一颗大土豆,刚出锅的"; 情况一:标准匹配

  • 我现在有点困惑,所以我有一个方法应该返回

  • 我有两个数据帧df1和df2。 i、 e.df1的索引为天,df2的索引为日期时间。我想在索引上执行DF1和DF2的内部连接,这样如果DF2中对应于DF2的时间在DF1中可用,则我们认为内部连接为真,否则为假。 我想获得两个df11和df22作为输出. df11将有共同的日期和相应的列从df1. df22将有共同的日期小时和相应的列从df2. "例如df1中的"2002-08-04"和df2中的"

  • 我在eclipse中使用“Jersey”原型开发了一个非常小的restful Web服务,并且在Tomcat中成功地部署了该服务。但是,我无法在WebLogic12c中部署它。这是我到目前为止所尝试的: 创建了一个包含泽西岛图书馆的共享库,正如我在其中一篇文章中看到的。这是我的pom.xml,它生成包含所需清单文件的共享库: 块引号 在我的webservice应用程序中的WEB-INF文件夹下添加