您的位置:首页 > 编程语言 > C语言/C++

a+b等于几(不用+)高级解法

2017-12-19 15:48 501 查看

a+b等于几——高级解法

码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创

  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。

  

实验环境

语言c/c++

编译器devc++5.11/5.40

实验内容与要求

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

说明
a和b都是 32位 整数么?
是的

我可以使用位运算符么?
当然可以

样例
如果 a=1 并且 b=2,返回3


目录

a+b等于几——高级解法
实验环境

实验内容与要求

目录

实验解析
思路
前言

高级方法
二进制四种情况运算结果对比:

函数说明
递归计算方法

非递归计算方法

主函数

结果展示

附录
相关资料

源代码
递归解法

非递归解法

码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创

实验解析

思路

前言

  简单方法确实想着简单,但是做起来还是分类挺多的,我们再来探究一下更简便的方法

不相同

初级解法

高级方法

二进制四种情况运算结果对比:

ab异或进位加法
000000
100101
010101
111010
大家有没有看出些什么?与运算表示进位,异或运算表示原位

那么现在不用再一位一位运算了,可以整体与向右移位后加上异或结果,这里可以运用递归。

函数说明

递归计算方法

int calculate(int a,int b){
int sum =0,carry=0;
if(a==0){
return b;
}
if(b==0){
return a;
}
sum = a^b;
carry = a&b;
carry = carry<<1; //左移
return calculate(sum,carry);
}


非递归计算方法

int calculate(int a,int b){
int sum =0,carry=0;
while(true) {

if(a==0){
return b;
}
if(b==0){
return a;
}
sum = a^b;
carry = a&b;
carry = carry<<1;
a = sum;
b = carry;
}
}


主函数

main(){
int a,b;
cin>>a>>b;
cout<<calculate(a,b)<<endl;
}


结果展示



附录

相关资料

参考资料

源代码

递归解法

#include <iostream>

using namespace std;
int calculate(int a,int b);
main(){
int a,b;
cin
4000
>>a>>b;
cout<<calculate(a,b)<<endl;
}
int calculate(int a,int b){
int sum =0,carry=0;
if(a==0){
return b;
}
if(b==0){
return a;
}
sum = a^b;
carry = a&b;
carry = carry<<1;
return calculate(sum,carry);
}


非递归解法

#include <iostream>

using namespace std;
int calculate(int a,int b);
main(){
int a,b;
cin>>a>>b;
cout<<calculate(a,b)<<endl;
}
int calculate(int a,int b){ int sum =0,carry=0; while(true) { if(a==0){ return b; } if(b==0){ return a; } sum = a^b; carry = a&b; carry = carry<<1; a = sum; b = carry; } }


码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息