ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-04-13

2021-04-13 13:32:07  阅读:91  来源: 互联网

标签:13 04 int 二进制 内态 ++ state 2021 输入


图灵机的实现
1.算法分析
首先将所给的十进制数转化为二进制,并将二进制数转化为收缩扩展的二进制编码,然后由初始内态0和输入,对应执行XN*2图灵机的指令,内态为0,输入为0时,内态和输入值不变,右移,输出输入值;内态为0,输入为1时,内态变为1,输入值变为0,右移,输出输入值;内态为1,输入为0时,内态变为0,输入值变为1,右移,输出输入值;内态为1,输入为1时,内态变为10,输入值变为0,右移,输出输入值;内态为10,输入为0时,内态变为11,输入值变为1,右移,输出输入值; 内态为11,输入为0时,内态变为0,输入值变为1,停止,输出输入,得到一个二进制数,最后将这个二进制数转化为十进制数。
2.概要设计
在这里插入图片描述
3.源代码

#include <iostream>
using namespace std;			//Xn*2的图灵机 

int BinarySystem(int z[],int p[],int x)		//将输入的十进制数转换为二进制输入到数组p[]
{
int num=0;                                          
 do//用除二求余法计算二进制
{
	z[num++]= x % 2;
           x= x / 2;
  }
while (x != 0);        
  for(int i = 0; i <= num - 1; i++)
          p[i]= z[num - 1 - i];
   for(int j=0; j<=num-1; j++)                     
           printf("%d",p[j]);
   printf("\n");
   return num-1;
}

int Binarynumber(int p[],int t[],int num)  //求扩展二进制,存在t[]中
{
   t[0]= 0;  
   int step=1;                                                                    
   for(int j=0;j<=num;j++)
   {
           if(p[j] == 1)
                    t[step++]= p[j];
           t[step++]= 0;
   }
   t[step++]=1;
   t[step++]=1;
   t[step]= 0;
   for(int k=0; k<=step; k++)     //检测此处是否正确
           printf("%d",t[k]);
   printf("\n");
   return step+1;  //记录拓展二进制的位数

}

int simulate_Turing(int t[],int count1)     //模拟过程
{
   int state=0,i=0,j=1;
   int count=count1;
   while(j)
   {
           if(state==0&&t[i]==0){
                    state=0;
                    t[i++]=0;}
           else	if(state==0&&t[i]==1){
                    state=1;
                    t[i++]=0;
           }
           else	if(state==1&&t[i]==0){
                    state=0;
                    t[i++]=1;
           }
           else	if(state==1&&t[i]==1){
                    state=10;
                    t[i++]=0;
           }
           else	if(state==10&&t[i]==0){
                    state=11;
                    t[i++]=1;
           }
          else if(state==11&&t[i]==0){
                    state=0;
                    t[i++]=1;
                    j=0;
           }
           if(i>=count)
                    count++;
           for(int k=0;k<count;k++)
                    printf("%d",t[k]);
           printf("\n");
   }
   return i+1;
}

int convert_Algorism(int p[],int t[],int count2)//将模拟后的拓展编码转换为二进制,存放在p[]中
{
   int m=0,n=0;
   int result=0;             //十进制结果
   int leap=1;                //二进制的位数
   while(m<count2-4)                  //最后三位是110,表逗号,不考虑
   {
           if(t[m]==t[m+1])             //相邻的俩个数相等是00的情况
           {
                    p[n]=0;             
                    n++;
                    m++;
           }
           else                                     //相邻的俩个数不相等是10或01的情况
           {
                    p[n]=1;                               
                    n++;
                    m=m+2;
           }
   }
   printf("\n");
   printf("模拟后的二进制为:");
   for(int i=1;i<n;i++)
           printf("%d",p[i]);
   printf("\n"); 
   for(int j=n-1;j>-1;j--)
   {
           if(p[j]==1)
           {
                    result+=leap;
                    leap*=2;
           }
           else
                    leap*=2;
   }
   return result;
}
int main() {
   int	x;                          // 模拟的数字 
   int	z[40]={0};             
   int	p[40]={0};           //存放二进制
   int	t[100]={0};          //存放拓展二进制 
   int	num;                    //求二进制时候的标志位 
   int	count1,count2;
   int	result;                  //使用图灵机模拟运算后的输出结果

   printf("请输入一个正整数x:");
   scanf("%d",&x);
   printf("该数字的二进制为:");
   num=BinarySystem(z,p,x);                               //返回数组下标
   printf("拓展编码:");
   count1=Binarynumber(p,t,num);                    //返回拓展二进位的数组下标
   printf("图灵机运行过程模拟:\n");
   count2=simulate_Turing(t,count1);                //返回每个运算后拓展二进制的位数
   result=convert_Algorism(p,t,count2);
   printf("计算结果为:%d",result);
   printf("\n");
   return 0;
}

``

4.测试结果

```mermaid
graph TD;
A-->B;
B-->C;

5.调试
6.心得体会
对于本次的课程设计,我们要完全了解XN*2图灵机的实现步骤,才能很好的对程序进行编写,运用了do while 等语句,解决问题的核心就在进制的转化,收缩拓展,以及内态输入指令的执行,其中还需要注意的是逗号转化为110,以及在程序设计中尽量使用简单函数。


标签:13,04,int,二进制,内态,++,state,2021,输入
来源: https://blog.csdn.net/weixin_55856743/article/details/115662800

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有