18.1---不用加号的加法(CC150)
1,自己写的又长又臭的代码,也能AC,但是太丑了。主要是通过二进制来算。
public static int addAB(int a, int b){
int res = 0;
String str1 = Integer.toBinaryString(a);
String str2 = Integer.toBinaryString(b);
ArrayList<Integer> list = new ArrayList();
int digit = 0;
int cur = 0;
int i = str1.length()-1;
int j = str2.length()-1;
while(i >= 0 && j >= 0){
int tmp = 0;
if(str1.charAt(i) == '1'){
System.out.println("here");
if(str2.charAt(j) == '1'){
if(cur == 1){
tmp = 1;
digit = 1;
}
else{
tmp = 0;
digit = 1;
}
}
else{
if(cur == 1){
digit = 1;
tmp = 0;
}
else{
digit = 0;
tmp = 1;
}
}
}
else{
if(str2.charAt(j) == '1'){
if(cur == 1){
digit = 1;
tmp = 0;
}
else{
tmp = 1;
digit = 0;
}
}
else{
if(cur == 1){
digit = 0;
tmp = 1;
}
else{
digit = 0;
tmp = 0;
}
}
}
cur = digit;
digit = 0;
list.add(tmp);
i--;
j--;
}
while(i >= 0){
int tmp = 0;
if(str1.charAt(i) == '1'){
if(cur == 1){
tmp = 0;
digit = 1;
}
else{
tmp = 1;
digit = 0;
}
}
else{
if(cur == 1){
tmp = 1;
digit = 0;
}
else{
digit = 0;
tmp = 0;
}
}
list.add(tmp);
cur = digit;
digit = 0;
i--;
}
while(j >= 0){
int tmp = 0;
if(str2.charAt(j) =='1'){
if(cur == 1){
tmp = 0;
digit = 1;
}
else{
tmp = 1;
digit = 0;
}
}
else{
if(cur == 1){
tmp = 1;
digit = 0;
}
else{
digit = 0;
tmp = 0;
}
}
list.add(tmp);
cur = digit;
digit = 0;
j--;
}
if(cur == 1){
list.add(1);
}
System.out.println(list);
int num = 0;
String str = new String();
for(int k = list.size()-1;k >= 0; k--){
str += list.get(k);
}
System.out.println(str);
return Integer.valueOf(str,2) ;
}
2,CC150课本上的答案。写的非常漂亮,一定要记住了。
思路,1,如果只加不进位,1+1=0,1,0相加1.0+0=0;2,如果看什么时候进位,11的时候。
所以就是a^b,a&b。但进位是往前的,所以,a&b<<1.
答案:
public static int addAB(int a, int b) {
// write code here
if(b == 0) return a;
int sum = a ^ b;//只加不进位
int carry = (a & b) << 1;//因为只有1,1,时候才进位。
return addAB(sum,carry);
}
18.1---不用加号的加法(CC150)的更多相关文章
- python不用加号实现加法
问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.E ...
- LeetCode(不用加号的加法)
题目: 设计一个函数把两个数相加,不得使用+或者其他算数运算符. 示例: 输入:a=1,b=1 输出:2 提示: a,b均有可能是负数或0 结果不会溢出32位整数 初始思路: 看到题目我就明白只能用位 ...
- C语言不使用加号实现加法运算的几种方法
今天看到<编码:隐匿在计算机软硬件背后的语言>的第十二章:二进制加法器.讲述了全加器,半加器的原理以及如何实现加法.实现加法时所使用的全加器,半加器中包含的所有逻辑门在C语言中都有相应的运 ...
- 编程算法 - 不用加减乘除做加法 代码(C)
不用加减乘除做加法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 写一个函数, 求两个整数之和, 要求在函数体内不得使用+, -, *, /四 ...
- Python 解决面试题47 不用加减乘除做加法
在看<剑指Offer>过程中,面试题47不用加减乘除做加法,给出的思路是使用二进制的异或以及与运算,总之就是使用二进制.但是在使用Python实现的过程中,对于正整数是没有问题的,但是对于 ...
- 剑指offer(48)不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目分析 不用加减乘除做加法,我第一时间想到的就是用位运算,毕竟计算机是二进制的,所有的操作都是以位运算为基础 ...
- 《剑指offer》第六十五题(不用加减乘除做加法)
// 面试题65:不用加减乘除做加法 // 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷ // 四则运算符号. #include <iostream> int A ...
- 剑指offer42:不用加减乘除做加法
分析: (1)十进制加法分三步:(以5+17=22为例) 1. 只做各位相加不进位,此时相加结果为12(个位数5和7相加不进位是2,十位数0和1相加结果是1): 2. 做进位,5+7中有进位,进位的值 ...
- 【剑指offer】面试题 65. 不用加减乘除做加法
面试题 65. 不用加减乘除做加法 题目描述 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. Java 实现 public class Solution { ...
随机推荐
- notification的使用
示例: NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); No ...
- Favorite Games
Samurai II: Vengeance: http://www.madfingergames.com/games
- ecshop 网站标题不更新或内容不更新
网站标题不更新,这种情况一般出在网站搬家的过程中,把以前的所有配置文件一起都搬到新的服务器上了. 网站状态: 后台店铺标题已经修改,前台不显示,数据shop_config 的shop_title能更新 ...
- 免费api大全
天气接口 气象局接口 完整数据:http://m.weather.com.cn/data/101010100.html 解析 用例 当天数据:http://www.weather.com.cn/dat ...
- EF框架之三种模式
使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. Entity Framewo ...
- 【转】apache kafka监控系列-KafkaOffsetMonitor
apache kafka监控系列-KafkaOffsetMonitor 时间 2014-05-27 18:15:01 CSDN博客 原文 http://blog.csdn.net/lizhitao ...
- 【转】Kafka producer原理 (Scala版同步producer)
转载自:http://www.cnblogs.com/huxi2b/p/4583249.html 供参考 本文分析的Kafka代码为kafka-0.8.2.1.另外,由于Kafka目前提供了两 ...
- Java 线程Thread.Sleep详解
我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4-7 12:00:00.000,如果 ...
- 【干货理解】理解javascript中实现MVC的原理
理解javascript中的MVC MVC模式是软件工程中一种软件架构模式,一般把软件模式分为三部分,模型(Model)+视图(View)+控制器(Controller); 模型:模型用于封装与应用程 ...
- 深入理解Javascript面向对象编程
深入理解Javascript面向对象编程 阅读目录 一:理解构造函数原型(prototype)机制 二:理解原型域链的概念 三:理解原型继承机制 四:理解使用类继承(继承的更好的方案) 五:建议使用封 ...