• 《Cracking the Coding Interview》——第7章:数学和概率论——题目4


    2014-03-20 02:16

    题目:只用加法和赋值,实现减法、乘法、除法。

    解法:我只实现了整数范围内的。减法就是加上相反数。乘法就是连着加上很多个。除法就是减到不能减为止,数数总共减了多少个。

    代码:

      1 // 7.4 Implement the -*/ function with only the + operator.
      2 // You cannot use bit operation, although you might want it for efficiency.
      3 #include <cstdio>
      4 using namespace std;
      5 
      6 int negate(int n)
      7 {
      8     int one = (n >= 0 ? -1 : 1);
      9     int res = 0;
     10     
     11     while (n != 0) {
     12         n += one;
     13         res += one;
     14     }
     15     
     16     return res;
     17 }
     18 
     19 int add(int x, int y)
     20 {
     21     return x + y;
     22 }
     23 
     24 int subtract(int x, int y)
     25 {
     26     return x + negate(y);
     27 }
     28 
     29 int multiply(int x, int y)
     30 {
     31     int res = 0;
     32     int value = (x >= 0 ? y : negate(y));
     33     int one = (x >= 0 ? -1 : 1);
     34     
     35     while (x != 0) {
     36         res += value;
     37         x += one;
     38     }
     39     
     40     return res;
     41 }
     42 
     43 int divide(int x, int y)
     44 {
     45     if (y == 0) {
     46         return 0;
     47     }
     48     if (x == 0) {
     49         return 0;
     50     }
     51     
     52     int res = 0;
     53     int one = 1;
     54     int negone = -1;
     55     int negy = negate(y);
     56     
     57     if (x > 0) {
     58         if (y > 0) {
     59             while (x >= y) {
     60                 x += negy;
     61                 res += one;
     62             }
     63         } else {
     64             while (x >= negy) {
     65                 x += y;
     66                 res += negone;
     67             }
     68         }
     69     } else {
     70         if (y > 0) {
     71             while (x <= negy) {
     72                 x += y;
     73                 res += negone;
     74             }
     75         } else {
     76             while (x <= y) {
     77                 x += negy;
     78                 res += one;
     79             }
     80         }
     81     }
     82     
     83     return res;
     84 }
     85 
     86 int main()
     87 {
     88     char s[10];
     89     int a, b;
     90     int res;
     91     
     92     while (scanf("%d%s%d", &a, s, &b) == 3) {
     93         switch (s[0]) {
     94         case '+':
     95             res = add(a, b);
     96             break;
     97         case '-':
     98             res = subtract(a, b);
     99             break;
    100         case '*':
    101             res = multiply(a, b);
    102             break;
    103         case '/':
    104             res = divide(a, b);
    105             break;
    106         }
    107         printf("%d
    ", res);
    108     }
    109     
    110     return 0;
    111 }
  • 相关阅读:
    css 实现的纸张卷曲效果
    前端如何优化代码&前端web安全
    React native
    君士坦丁堡分叉引起的安全问题
    不用外部插件启用u盘ntfs写功能
    使用ubuntu搭建时间机器备份服务
    从一起“盗币”事件再谈合约安全问题
    如何让你的项目同时支持go vendor和go module
    golang plugin的依赖问题
    Plasma Cash合约解读
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3612771.html
Copyright © 2020-2023  润新知