剑指Offer - 九度1507 - 不用加减乘除做加法
剑指Offer - 九度1507 - 不用加减乘除做加法
2013-11-29 20:00
- 题目描述:
-
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000)。
- 输出:
-
对应每个测试案例,输出m+n的值。
- 样例输入:
-
3 4
7 9
- 样例输出:
-
7
16
题意分析:
求两个数的和而不能用加减乘除,很明显又得借助位运算了。回想一下学Verilog时加法器的实现,能记住下面这两个关系:
sum = bit1 ^ bit2 ^ carry
carry' = (carry & bit1) | (bit1 & bit2) | (bit2 & carry)
其中sum是当前位的和,bit1和bit2是两数的当前二进制位,carry是上一位的进位,carry'是这一位的进位。
简单解释一下俩式子:
式子1:加法和异或的区别就在于加法可以进位,而异或不进位。
式子2:三个数只要有两个以上的‘1’就有进位了,所以是三个与的或。
接下来就是逐位相加,将进位carry一直向上传递了。要注意别让最高位的carry丢失掉,除非是超出了本身数据能表示的范围。
既然是写个加法器,依然本着写Verilog的原则,拒绝for循环。以下是ac的代码。
// 653474 zhuli19901106 1507 Accepted 点击此处查看所有case的执行结果 1020KB 1439B 10MS
//
#include <cstdio>
using namespace std; void cal_onebit(const int m, const int n, int i, int &carry, int &res)
{
res = (res |
(
(m & ( << i)) ^
(n & ( << i)) ^
(carry << i)
)
);
carry =
(
(m & ( << i)) &
(n & ( << i))
) ||
(
(n & ( << i)) &
(carry << i)
) ||
(
(carry << i) &
(m & ( << i))
);
} int main()
{
int m, n;
int res;
int carry; while(scanf("%d%d", &m, &n) == ){
carry = ;
res = ;
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
cal_onebit(m, n, , carry, res);
printf("%d\n", res);
} return ;
}
剑指Offer - 九度1507 - 不用加减乘除做加法的更多相关文章
- 剑指offer(48)不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目分析 不用加减乘除做加法,我第一时间想到的就是用位运算,毕竟计算机是二进制的,所有的操作都是以位运算为基础 ...
- 【剑指Offer】48、不用加减乘除做加法
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题思路: 本题同样是对发散思维能力的一个考察.首先,我们需要考虑是要求和却不能使用四则运算 ...
- 剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)
剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)2014-02-05 19:37 题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.H ...
- 剑指Offer - 九度1348 - 数组中的逆序对
剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...
- 剑指Offer - 九度1283 - 第一个只出现一次的字符
剑指Offer - 九度1283 - 第一个只出现一次的字符2013-11-21 21:13 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出 ...
- 剑指Offer - 九度1524 - 复杂链表的复制
剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...
- 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先
剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...
- 剑指Offer - 九度1508 - 把字符串转换成整数
剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...
- 剑指Offer - 九度1504 - 把数组排成最小的数
剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...
随机推荐
- MySQL的四种主要存储引擎
在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库.而在设计表的时候,我们都会关注一个问题,使用什么存储引擎.等一下,存储引擎?什么是存储引擎? 什么是存储引擎? ...
- phpStudy-FTP_Server插件安装使用教程
FileZilla Server使用教程 ftp server安装教程 除了phpStudy for IIS外其他版本phpStudy不再集成ftp server外. phpStudy for IIS ...
- python里json的排序
写一下json排序的问题: 将得到的数据转换成json格式传给ajax,会发现前台得到的数据很有可能和我们在后台的内容’不太一样‘,如果不出意外,json进行了自排序处理,至于按什么格式排的我还没研究 ...
- Gym 100090D Insomnia
从 n 变到 1,有多少种方案? 打表记忆化. #include <bits/stdc++.h> using namespace std; int n; ]; int dfs(int n) ...
- Linux内存管理 - buddy系统
本文目的在于分析Linux内存管理机制中的伙伴系统.内核版本为2.6.31.1. 伙伴系统的概念 在系统运行过程中,经常需要分配一组连续的页,而频繁的申请和释放内存页会导致内存中散布着许多不连续的页, ...
- SqlServer中怎么删除重复的记录(表中没有id)
SqlServer中怎么删除重复的记录(表中没有id) 其实我在别的网址也查到过删除重复的记录,不知道我是我SqlServer2012版本太低还是啥原因 delete from scwhere (c# ...
- java基础30问
Java基础知识30问 1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用 ...
- WebStrome react-native代码智能提示
1.clone到本地 git clone https://github.com/virtoolswebplayer/ReactNative-LiveTemplate 2,添加ReactNative. ...
- VMware中Ubuntu开机时停在启动界面,不进入X-window的解决办法
启动Ubuntu虚拟机时,停在这个画面不动: 试了若干次,都是这样.尝试了新建一个虚拟机然后把.vmdk文件拷过去启动,无法解决. 尝试重启,在这个界面按esc进入grub: 选择恢复模式 recov ...
- GMT 时间格式转换到 TDateTime (Delphi)
//GMT 时间格式转换到 TDateTime //忽略时区 function GMT2DateTime(const pSour:PAnsiChar):TDateTime; function GetM ...