请教算法题---在特定机器上实现加减乘除


一台机器,只能做如下操作:
1.加1操作
2.固定次数的循环操作
3.只能操作正数和0
4.不会溢出
求实现变量的加减乘除

57 个解决方案

#1


tmp = 0
result = 0
loop(n) {
   result = tmp
   tmp++
}


这段代码执行后,result 的值将变为 n - 1。

现在,我们相当于有了自减一的函数 dec。

实现 a - b 只需要令 a 自减 b 次即可:

result = a
loop(b) {
   dec(result)
}

#2


在这个系统上实现加法很容易,让 a 自增 b 次即可:

result = a
loop(b) {
   result++
}

#3


乘法 a * b 双重循环:

result = 0
loop(a) {
   loop(b) {
      result++
   }
}

#4


引用 1 楼 wuyi8808 的回复:
Assembly codetmp = 0
result = 0
loop(n) {
   result = tmp
   tmp++
}



这段代码执行后,result 的值将变为 n - 1。 

现在,我们相当于有了自减一的函数 dec。 

实现 a - b 只需要令 a 自减 b 次即可: 


Assembly coderesult = a
loop(b) {
   dec(result)
}

如何自减b次呢,只能做固定次数循环啊,不能做b的循环...

#5


主要是固定次数循环比较痛苦

#6


固定次数循环是什么意思,请举例说明。

#7


引用 4 楼 ygb913 的回复:
只能做固定次数循环啊,不能做b的循环...


如果不能做b的循环,那能做什么循环呢?请写出个循环的例子。

固定次数循环如何理解,不会说只能做28的循环吧?

也就是说程序中只能写:

loop(28) {
   ...
}


其他的循环一概非法。



本人愚钝,实在不能理解LZ 固定次数循环的意思。

#8


引用 5 楼 ygb913 的回复:
主要是固定次数循环比较痛苦



我也很痛苦,不知什么是 固定次数循环

#9


引用 7 楼 wuyi8808 的回复:
引用 4 楼 ygb913 的回复:
只能做固定次数循环啊,不能做b的循环... 

如果不能做b的循环,那能做什么循环呢?请写出个循环的例子。 

固定次数循环如何理解,不会说只能做28的循环吧? 

也就是说程序中只能写: 


Assembly codeloop(28) {
   ...
}



其他的循环一概非法。 


本人愚钝,实在不能理解LZ固定次数循环的意思。

是这样的,呵呵,题目就写的是固定次数的循环,我的理解就是你说的假设只能做k次,那么每次就循环k次,也是特别提到这个固定次数的循环,不然就不用说“固定”2个字了,直接说循环好了,毕竟循环b次的话,循环次数可以通过变量来定义就不是固定次数了,你觉得呢?

#10


那你给我写个简单的 a + b 的程序好了,我万分佩服。

#11


楼上别激动,不好意思哈,我不是来炫耀怎么解的,我就是不晓得怎么解,想了很久了......来看看大家有什么看法

#12


引用 9 楼 ygb913 的回复:
题目就写的是固定次数的循环,我的理解就是你说的 假设只能做k次,那么每次就循环k次,也是特别提到这个固定次数的循环,不然就不用说“固定”2个字了


我很 痛苦,要是这样的话,我连最简单的 a + b 也不会做了。

#13


洗澡去,回头在想想

#14


我觉得,"固定次数" 理解为在循环执行之前,循环次数已确定就可以了;

#15


除法怎么定义,取整除的结果吗?

#16


等号可以用不,赋值运算符

#17


"固定次数" 就是不能根据其他条件跳出循环,loop(b)是可以的

#18


我也应用一下
引用 1 楼 wuyi8808 的回复:
Assembly codetmp = 0
result = 0
loop(n) {
   result = tmp
   tmp++
}



这段代码执行后,result 的值将变为 n - 1。 

现在,我们相当于有了自减一的函数 dec。 

实现 a - b 只需要令 a 自减 b 次即可: 


Assembly coderesult = a
loop(b) {
   dec(result)
}

#19


除法,a 除以 b 的整除结果:

result = 0
a1 = a
loop(a1) {
   tmp = 0
   a1 = sub(a1, b)
   loop(a1) {
      tmp = 1
   }
   result = add(result, tmp)
}


程序中 sub() 和 add() 分别是前面定义的减法和加法。

#20


引用 16 楼 shaolei_000 的回复:
等号可以用不,赋值运算符


赋值应该是可以的,不然怎么干活?

#21


引用楼主 ygb913 的帖子:
一台机器,只能做如下操作: 
1.加1操作 
2.固定次数的循环操作 
3.只能操作正数和0 
4.不会溢出 
求实现变量的加减乘除


LZ的描述太不严密了,看我的:

引用
一台机器,只能做如下操作: 
1. 定义变量
2. 给变量赋值
3. 变量自身加一
4. 令一段语句循环执行指定的次数
5. 只能操作正数和0
6. 不会溢出 
求实现变量的加减乘除。


注:
这台机器没有比较运算,甚至不存在 boolean 值和判断语句;
循环语句也不是 for i = a to b do 的形式,只能是 loop(n) 的形式。

#22


#23


貌似是百度今天校园招聘的笔试题?

#24


sorry,19楼程序有 BUG,在 a 能整除 b 时不正确,更正如下:

result = 0
a++
loop(a) {
   tmp = 0
   a = sub(a, b)
   loop(a) {
      tmp = 1
   }
   loop(tmp) {
      result++
   }
}

#25


#26


引用 24 楼 wuyi8808 的回复:
sorry,19楼程序有 BUG,在 a 能整除 b 时不正确,更正如下:

Assembly coderesult =0a++
loop(a) {
   tmp =0a =sub(a, b)
   loop(a) {
      tmp =1}
   loop(tmp) {
      result++
   }
}

看不懂,晕

#27


1楼的减法程序明确写出来就是这样的:

loop(b) {
   tmp = 0
   result = 0
   loop(a) {
      result = tmp
      tmp++
   }
   a = result
}
result = a


实现的功能是 result =  sub(a, b)。

#28


24楼的除法程序明确写出来就是这样的:

result = 0
a++
loop(a) {
   loop(b) {
      tmp = 0
      a1 = 0
      loop(a) {
         a1 = tmp
         tmp++
      }
      a = a1
   }
   tmp = 0
   loop(a) {
      tmp = 1
   }
   loop(tmp) {
      result++
   }
}

#29


加上2楼的加法和3楼的乘法,加减乘除四则运算就都有了。

#30


除了整除(DIV)运算外,还可以定义取模(MOD)运算:

a MOD b = a - (a DIV b) * b

这样,除法运算就完整了。

#31


先顶,然后慢慢看。

#32


额外赠送一个计算 a 的 b 次方的程序:

result = 1
loop(b) {
   tmp = 0
   loop(a) {
      loop(reslut) {
         tmp++
      }
   }
   reslut = tmp
}

#33


mark

#34


28楼的朋友,对除法的算法没有看懂,麻烦大概讲一下,谢谢

#35



unsigned int add(unsigned int a,unsigned int b)
{
unsigned int i=0;
while(i!=b)
{
a++;
i++;
}
return a;
}

// 没有考虑a<b的情况
unsigned int sub(unsigned int a,unsigned int b)
{
unsigned int sub = 0;
while(b!=a)
{
b++;
sub++;
}
return sub;
}

unsigned int mul(unsigned int a,unsigned int b)
{
unsigned int i=1;
unsigned int multi=a;
while(i<b)
{
multi = add(multi,a);
i++;
}
return multi;
}


-------------------
1,还没有实现除法,但也可以这样实现
2, 乘法,当b==0时不能得到正确值0,不知道机器是否支持分支

#36


引用 28 楼 wuyi8808 的回复:
24楼的除法程序明确写出来就是这样的: 


Assembly coderesult = 0
a++
loop(a) {
   loop(b) {
      tmp = 0
      a1 = 0
      loop(a) {
         a1 = tmp
         tmp++
      }
      a = a1
   }
   tmp = 0
   loop(a) {
      tmp = 1        
   }
   loop(tmp) {
      result++
   }
}


loop(a) {
      tmp = 1        
   }
 这里tmp=1什么意思啊,tmp一直是1的意思吗,不太懂assembly code ,还有除法整个有点看不明白,麻烦解释下 谢了.

#37


明白了,做完减法 a=a-b, 然后判断a是否为正,是则让temp=1,然后result自加一次

比如 9/3,a++->a=10  10-3 = 7-> a=7 temp =1 -> result++  result =1 ->temp=0
          a=7 7-3=4 -> a=3 temp = 1 -> result ++ ->result =2
          a=4  4-3=1 -> a=1 temp =1-> result++ ->result = 3
          a=1  1-3=0 -> end.

写的有点乱, 反正我是这么理解的.

顺便问一句,,我只学了C,  assembly code没接触过,,这种代码不用写分号的吗?  按照你们写的格式就可以直接编译了吗?

#38


我觉得算法挺饶人的!
要想很久!

#39


自减一算法比较关键,想不到的话,后面的减法、除法都是无根之木

#40


/* -------------------------------------------------- *
   允许用 unsigned int 声明变量
   允许使用赋值语句
   允许变量自增
   可以使用 loop 循环,并且循环体中不能出现 _i_
   return 语句可以出现在函数体的最后一行
   其他都不允许
 * -------------------------------------------------- */

#define loop(n) for (unsigned _i_ = 0; _i_ < (n); _i_++)


// 加:a + b
unsigned int add(unsigned int a, unsigned int b)
{
  unsigned int result = a;
  loop(b)
  {
    result++;
  }
  return result;
}

// 减:a - b
unsigned int sub(unsigned int a, unsigned int b)
{
  loop(b)
  {
    unsigned int tmp = 0;
    unsigned int result = 0;
    loop(a)
    {
      result = tmp;
      tmp++;
    }
    a = result;
  }
  return a;
}

// 乘:a * b
unsigned int mul(unsigned int a, unsigned int b)
{
  unsigned int result = 0;
  loop(a)
  {
    loop(b)
    {
      result++;
    }
  }
  return result;
}

// 整除:a / b
unsigned int div(unsigned int a, unsigned int b)
{
  unsigned int result = 0;
  a++;
  loop(a)
  {
    unsigned int tmp;
    loop(b)
    {
      tmp = 0;
      unsigned int a1 = 0;
      loop(a) {
        a1 = tmp;
        tmp++;
      }
      a = a1;
    }
    tmp = 0;
    loop(a) {
      tmp = 1;
    }
    loop(tmp)
    {
      result++;
    }
  }
  return result;
}

// 模:a % b
unsigned int mod(unsigned int a, unsigned int b)
{
  // 这个写法出现函数调用,不符合规范,需要手工展开
  return sub(a, mul(div(a, b), b));
}

// 乘方:a 的 b 次方
unsigned int power(unsigned int a, unsigned int b)
{
  unsigned int result = 1;
  loop(b)
  {
    unsigned int tmp = 0;
    loop(a)
    {
      loop(reslut)
      {
        tmp++;
      }
    }
    reslut = tmp;
  }
  return result;
}

#41


引用 21 楼 wuyi8808 的回复:
一台机器,只能做如下操作: 
1. 定义变量 
2. 给变量赋值 
3. 变量自身加一 
4. 令一段语句循环执行指定的次数 
5. 只能操作正数和0 
6. 不会溢出 

注: 
这台机器没有比较运算,甚至不存在 boolean 值和判断语句; 
循环语句也不是 for i = a to b do 的形式,只能是 loop(n) 的形式。 


其实 C/C++ 并不能完全模拟该机器,“不会溢出”这条就做不到。


另,上述程序中的
#define loop(n) for (unsigned _i_ = 0; _i_ < (n); _i_++)


应改为
#define loop(n) for (unsigned int _n_ = (n), _i_ = 0; _i_ < (_n_); _i_++)


因为在循环体中改变循环次数是不允许的,当然循环体中也不能出现 _n_。

#42


loop(n) for (unsigned int _n_ = (n), _i_ = 0; _i_ < (_n_); _i_++)

#43


引用 42 楼 shanghai2431 的回复:
loop(n) for (unsigned int _n_ = (n), _i_ = 0; _i_ < (_n_); _i_++)


不谋而合。

#define loop(n) for (unsigned int _n_ = (n), _i_ = 0; _i_ < _n_; _i_++)


(_n_) 两端的括号是多余的。

#44


引用 43 楼 wuyi8808 的回复:
  // 这个写法出现函数调用,不符合规范,需要手工展开

// 模:a % b
unsigned int mod(unsigned int a, unsigned int b)
{
  return sub(a, mul(div(a, b), b));
}


如果LZ题目中的“实现加减乘除”这个要求是实现各个功能的函数的话,也算是符合规范的。
不然一个应用实例 a= mod(x,y) 本身就是函数调用。。。。

#45


关注.

#46


【强】最新金宝马程序破解. 

专业仪器QQ1071208155★上分器★定位器★退币器★干扰器★        


〓』  

→上海北京↑广东↑福建↑天津↑河北↑山西↑吉林↑江苏↑辽宁↑云南↑陕西↑重庆↑安徽↑山东↑浙江↑内蒙↑四川◇河南↑广西↑贵州↑湖北↑湖南↑甘肃↑青海↑台湾各省地均可销售← 
  ±±±±±±±±±±±±±±±±                      
    『凯特电子娱乐有限公司专业虎机技术』  
    详情咨询:  QQ:1071208155        

  
    经营产品:上分器 干扰器 遥控器  
  ±±±±±±±±±±±±±±±±    
______________________________________

#47


【强】最新金宝马程序破解. 

专业仪器QQ1071208155★上分器★定位器★退币器★干扰器★        


〓』  

→上海北京↑广东↑福建↑天津↑河北↑山西↑吉林↑江苏↑辽宁↑云南↑陕西↑重庆↑安徽↑山东↑浙江↑内蒙↑四川◇河南↑广西↑贵州↑湖北↑湖南↑甘肃↑青海↑台湾各省地均可销售← 
  ±±±±±±±±±±±±±±±±                      
    『凯特电子娱乐有限公司专业虎机技术』  
    详情咨询:  QQ:1071208155        

  
    经营产品:上分器 干扰器 遥控器  
  ±±±±±±±±±±±±±±±±    
______________________________________

#48


#define loop(n) for (unsigned int _n_ = (n), _i_ = 0; _i_ < (_n_); _i_++)


_n_ 和 _i_是什么意思啊?

#49


临时变量。

#50


前后加下划线主要是为了防止和程序中的其他普通变量重名。
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告