另类加法&&求路径总数

OJ编程

请编写一个函数,将两个数字相加。不得使用+或其他算数运算符。

给定两个int AB。请返回A+B的值

解:另类加法是挺另类的,不让用 + 。(在OJ上其实用 + 也没有检测出来)。但是抱着学习新知识的态度,这道题可以用 位操作 来实现。首先我们知道加的结果其实是两个数当前位相加之后再加上进位的值。用十进制表示就是:

15 + 16 == ?

 1    5
+1    6
————————
 2    11  --->  1
个位只能是10一下的数,因此11 % 10 == 1,进位 = 10
即就是
20 + 1 + 10 = 31
——————   ——   ——
当前位   进位  结果

现在就需要用位操作来把这个过程表示出来。看下面的例子

现在用^来表示加当前位,因为
1^1 == 0    由于进位所以当前位是0,向前进 1
1^0 == 1    1 + 0 = 1
0^0 == 0    0 + 0 = 0
用&来表示产生进位
1&1 == 1    产生进位,产生进位需要向左移,把 1 传给下一位
1&0 == 0    没有进位
0&0 == 0    没有进位

于是:
3    +    2
用二进制表示就是
 00000000    00000000    00000000    00000001
+00000000    00000000    00000000    00000011
————————————————————————————————————————————————
(3^2) + (3&2 << 1) == (3^2)^(3&2 << 1) + (3^2)&(3&2 << 1) == ……

于是只要进位是 0 的话,就求出来结果了

请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

解:其实一般涉及二维数组,然后求多少种方案等都和动态规划脱不了干系。这道题也可以用动态规划实现。

因此要求m x n个格子有多少种走法,我还是先求第i x j个各自有多少种吧,最最先的我还是求1 x 1个各自有多少种走法吧。从上面的图可以看到到达格子右下角的方法就是,从上面格子和左边格子的右下角到达,于是到达格子路径数量 = 上面格子路径数 + 左边格子路径数。对于边上的格子就只能是 m + 1 或者 n + 1了。

int PathNum(int n, int m)
{
    if(n > 1 && m > 1)
        return PathNum(n - 1, m) + PathNum(n, m -1);
    else if(n == 1 || m == 1)
        return m + n;
    else
        return 0;
}

戳题目参考源代码

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值