一、题目分析
构造一个图灵机,对输入的十进制数据进行XN+1操作并将中间过程以及结果输出在屏幕上。
二、算法构造
首先设计一个函数用于将十进制的数据转化为二进制,先求得十进制数转化为二进制数最高位数,然后对十进制数据循环模2然后除以2,得到的每一个数据即为十进制数对应的二进制编码存入到数组arr[]中。代码如下:
根据二进制编码扩展的规则:第二个序列的每一数字就是在第一个序列中的连续的0之间的1的个数。转化代码如下:
根据图灵机(XN+1)的指令:0 0→0 0R,0 1→1 1R,1 0→0 0R,1 1→10 1R,10 0→11 0L,10 1→10 1R,11 0→0 1STOP,11 1→100 0L,100 0→101 1L,100 1→100 1L,101 0→110 0R,101 1→10 1R,110 1→111 1R,111 0→11 1R,111 1→111 0R。设计出操作扩展二进制码执行(XN+1)的算法,用一个变量用于存放内态的数值,循环判断内态的值和扩展二进制编码每一位的编码执行图灵机(XN+1)对应的指令完成+1操作。
三、算法实现
#include<stdio.h>
#include<math.h>
void main()
{
int k,j,x,y,m,yy=0;
int temp=0;
int arr[100];
int zhuanma[100];
int jieguo[100];
printf("输入数据:");
scanf("%d",&x); //从键盘输入数据为变量x赋值
y=x;
for(int i=30;i>=0;i--) //求出该十进制数转化为二进制数后的最高位数
{
m=y/pow(2,i);
if(m>0)
break;
}
//printf("%d\t%d\n",m,i);
int z=i;
for(k=0;z>=0;z--,k++) //将十进制数转化为二进制数的每一位存入到数组中
{
arr[k]=y/(pow(2,z));
y