仅使用特定方法的计算器。正常和递归

时间:2018-06-25 08:47:49

标签: c++ recursion iteration calculator

所以atm一直困扰我的计算器。只能使用以下方法:

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



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

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

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;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您可以减去和加法,则可以处理整数除法。用伪代码就是:

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而y> x


上面是整数部分。整数既好又容易,因为它可以提供精确的操作。 base 中的浮点表示总是接近尾数* base exp ,其中尾数是最大位数的整数或0到1之间的数字(以正常表示)。并且您可以从一种表示形式传递到另一种表示形式,但要用尾数的位数来改变指数部分:2.5是.25 10 1 <的25 10 -1 (整数尾数) / sup>(0 <=尾数<1)。

因此,如果要使用以10为底的浮点数,则应该:

  • 将整数转换为浮点(尾数+指数)表示形式
  • 对于加法和减法,结果指数是先验,指数越大。两个尾数均应按该指数缩放并加/减。然后必须调整最终指数,因为该操作可能添加了一个额外的数字(7 + 9 = 16)或导致最高位的数字消失了(101-98-3)
  • 对于产品,您需要添加指数并乘以尾数,然后对结果进行规格化(调整指数)
  • 对于除法,您可以按最大位数对尾数进行缩放,使用整数除法算法进行除法,然后再次进行归一化。例如,使用以下命令可获得精度为6位数的1/3: 1/3 =(1 * 10 6 / 3)* 10 -6 =(1000000/3)* 10 -6

它给出333333 * 10 -6 ,因此.333333以规范化形式

好吧,这将是很多沸腾的代码,但没有什么真正困难的。

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