c++ - 仅具有特定方法的计算器。正常和递归

标签 c++ recursion iteration calculator

所以 atm 我坚持使用我的计算器。只允许使用以下方法:

int succ(int x){
    return ++x;
}



int neg(int x){
    return -x;
}

我已经得到的是+,-。 *。 Iterativ 也是递归的(所以如果需要我也可以使用它们)。 现在我坚持使用 divide 方法,因为我不知道如何处理逗号及其背后的逻辑。想象一下处理 succ() 和 neg() 的样子,这是一个减法迭代和递归的例子:

int sub(int x, int y){
    if (y > 0){
        y = neg(y);
        x = add(x, y);
        return x;
    }
    else if (y < 0){
        y = neg(y);
        x = add(x, y);
        return x;
    }
    else if (y == 0) {
        return x;
    }
   }

int sub_recc(int x, int y){
    if (y < 0){
        y = neg(y);
        x = add_recc(x, y);
        return x;
    } else if (y > 0){
        x = sub_recc(x, y - 1); 
        x = x - 1;
        return x;
    }else if( y == 0) {
        return x;
    }
}

最佳答案

如果你会减法和加法,那么你就能处理整数除法。在伪代码中它只是:

division y/x is:
   First handle signs because we will only divide positive integers
   set sign = 0
   if y > 0 then y = neg(y), sign = 1 - sign
   if x > 0 then y = neg(y), sign = 1 - sign
   ok, if sign is 0 nothing to do, if sign is 1, we will negate the result

   Now the quotient is just the number of times you can substract the divisor:
   set quotient = 0
   while y > x do
       y = y - x
       quotient = quotient + 1
   Ok we have the absolute value of the quotient, now for the sign:
   if sign == 1, then quotient = neg(quotient)

C++语言的正确翻译以及递归部分留作习题...

提示递归 y/x == 1 + (y-x)/x while y>x


上面是整数部分。整数既好又简单,因为它提供了精确的操作。 base 中的浮点表示总是接近 mantissa * baseexp ,其中 mantissa 是具有最大位数的整数或介于 0 和 1 之间的数字(表示正常表示)。您可以从一种表示形式传递到另一种表示形式,但通过尾数的位数更改指数部分:2.5 是 25 10-1 (int mantissa) of .25 101(0 <= 尾数 < 1)。

所以如果你想操作以 10 为基数的 float ,你应该:

  • 将整数转换为 float (尾数+指数)表示
  • 对于加法和减法,结果指数先验是指数中较大的那个。两个尾数都应按比例缩放到该指数并相加/相减。然后必须调整最后的指数,因为该操作可能添加了一个额外的数字 (7 + 9 = 16) 或导致最高阶数消失 (101 - 98 - 3)
  • 对于乘积,您添加指数并乘以尾数,然后归一化(调整指数)结果
  • 对于除法,您将尾数按最大位数缩放,使用整数除法算法进行除法,然后再次归一化。例如,精度为 6 位的 1/3 是通过以下方式获得的: 1/3 = (1 * 106/3) * 10-6 = (1000000/3) * 10-6

它以标准化形式给出 333333 * 10-6 所以 .333333

好吧,这会是很多沸腾的代码,但没什么难的。

日志故事简短:只要记住你是如何用纸和铅笔学到的......

关于c++ - 仅具有特定方法的计算器。正常和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51019477/

相关文章:

c++ - 这些编译器之间有什么区别吗?

c++ - 如何在非类型模板类的专门化声明之外定义方法?

c++ - 如何退出单圈 `for` 循环?

java - 如何检查和匹配 arraylist 元素的可能组合

javascript - 循环 css div 在 javascript 中留下一个数组

java - 是否可以在不迭代的情况下对哈希集中的对象执行操作

c++类实例错误lnk2019

java - 设置父节点

recursion - 通过重复除法进行有根据的递归

python - 带有 __iter__ 的类允许某人调用 next() 同时修改集合