OJ编程
-
1、另类加法
请编写一个函数,将两个数字相加。不得使用+或其他算数运算符。
给定两个int A和B。请返回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 的话,就求出来结果了
-
2、求路径总和
请编写一个函数(允许增加子函数),计算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;
}
-
3、源代码地址
戳题目参考源代码