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 { ...
随机推荐
- linux设置和删除环境变量
删除环境变量: unset -v PKG_CONFIG_PATH 添加环境变量: export PKG_CONFIG_PATH="你需要设置的路径", 例如: export LAN ...
- web前端工程师校园招聘要求
小燕子对紫薇说:“这辈子也别想着进皇宫了”.可后来她们不但进了宫,还都当上了格格.你在想什么?走呗! 1.去哪了网 前端开发工程师 工作地点:北京 工作职责: 负责去哪儿网各产品线Web前端研发: 负 ...
- NoSQL 简介及什么是AICD
NoSQL 简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". 在现代的计算系统上每天网络上都会产生庞大的数据量. 这些数据有很大一部分是由关 ...
- array_flip() array_merge() array+array的使用总结
array_flip(array); //传递一个数组参数,对该数组的键.值进行翻转 例如: $a = array( 'a', 'b', 'c' ); print_r(array_flip($a)); ...
- mapreduce 自定义数据类型的简单的应用
本文以手机流量统计为例: 日志中包含下面字段 现在需要统计手机的上行数据包,下行数据包,上行总流量,下行总流量. 分析:可以以手机号为key 以上4个字段为value传传递数据. 这样则需要自己定义一 ...
- abrtd是什么进程
abrtd 是一个守护进程监控的应用程序崩溃.当发生崩溃时,它将收集的崩溃(核心文件的命令行, etc .)application ,并采取措施根据类型崩溃并根据 abrt.conf config 文 ...
- Javascript 方法大全
一.基础知识 1 创建脚本块 1: <script language=”JavaScript”> 2: JavaScript code goes here 3: </script&g ...
- ThinkPHP3.2.3 安装教程
本文以 Windows 平台为例 安装前准备:Windows操作系统的电脑,php编程环境(配置好了Apache.MySql.php).推荐wampserver. 待安 ...
- PHP读取excel文档
PHP读取excel文档 项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel. PHPExcelReader比较轻量级, ...
- cocos2d-x内存管理(见解)
cocos2d-x 延续了cocos2d 和OC的引用计数的内存管理机制! 下面我们来看看CCDriectro类 CCPoolManager::sharedPoolManager()->push ...