剑指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 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...
随机推荐
- Python用户交互与流程控制
1. 用户交互 python3通过input实现用户交互,与python2的raw_input一样,接收的值都转换成字符串格式.python2中也有一个input,而python2中的input接收的 ...
- Uva 10820 交表
题目链接:https://uva.onlinejudge.org/external/108/10820.pdf 题意: 对于两个整数 x,y,输出一个函数f(x,y),有个选手想交表,但是,表太大,需 ...
- EasyHook实用指南
所谓实用指南就是全是干货,没那么多虚头巴脑的东西,真正要用的人会发现对自己有用的东西,浅尝辄止的人看起来会不知所云. FileMon自己实做的过程中遇到的问题: 1. exe和dll文件必须强命名,对 ...
- update_TypeError
TypeError: ( 'An update must have the same type as the original shared variable ( shared_var=W, shar ...
- idea中将项目转换成Maven项目
第一步:项目右键->Add Framework... 选择maven ok 这样就成功转换成了一个maven项目
- 【洛谷P1962】斐波那契数列
斐波那契数列 题目链接:https://www.luogu.org/problemnew/show/P1962 矩阵A 1,1 1,0 用A^k即可求出feb(k). 矩阵快速幂 #include&l ...
- 一步步做程序优化-讲一个用于OpenACC优化的程序(转载)
一步步做程序优化[1]讲一个用于OpenACC优化的程序 分析下A,B,C为三个矩阵,A为m*n维,B为n*k维,C为m*k维,用A和B来计算C,计算方法是:C = alpha*A*B + beta* ...
- SQL按时间段统计(5分钟统计一次访问量为例,oracle统计)
需求:统计当天的访问量,每五分钟采集一次 表结构中有日期字段,类型TIMESTAMP 如果,统计是采用每秒/分钟/小时/天/周/月/年,都非常容易实现,只要to_char日期字段然后group by分 ...
- java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...
- lnmp安装后,phpmyadmin空白
使用lnmp 一键安装后,运行phpinfo是没有问题的,说明php没有问题,但是运行phpmyadmin确实一片空白,网上说的解决方案有几种: 1.config.inc.php增加一个配置$cfg[ ...