只用+操作实现 -,*,/操作
来源:互联网 发布:tvb电视剧播放软件 编辑:程序博客网 时间:2024/04/27 11:20
减法:a-b = a + (-b)
乘法:a*b相当于将a累加abs(b)次
除法:相当于将abs(a)减去-abs(b)的次数
//求lhs的反面值rhs,即求rhs使得lhs + rhs = 0
int Negate(int lhs)
{
int step = (lhs>0)?-1:1, ret = 0;
while(lhs != 0)
{
lhs += step;
ret += step;
}
return ret;
}
int Abs(int lhs)//返回i的绝对值
{
if(lhs < 0) return Negate(lhs);
return lhs;
}
//lhs - rhs = lhs + (-rhs)
int Subtract(int lhs, int rhs)
{
return lhs + Negate(rhs);
}
int Multiply(int lhs, int rhs)
{
if(Abs(lhs) < Abs(rhs)) return Multiply(rhs, lhs);
int ret = 0;
for(int i = Abs(rhs); i>0; --i) ret += lhs;
return (rhs<0)?Negate(ret):ret;
}
//lhs, rhs符号不同
bool Diff(int lhs, int rhs)
{
return (lhs<0&&rhs>0) || (lhs>0&&rhs<0);
}
int Division(int lhs, int rhs)
{
if(rhs == 0)//防止除0
{
perror("Devide 0.");
exit(1);
}
int step = (rhs>0)?Negate(rhs):rhs;
int ret = 0;
for(int sum=Abs(lhs); sum+rhs>=0; sum+=rhs)
++ret;
return Diff(lhs,rhs)?Negate(ret):ret;
}
简单测试:
int a = 13,b = -5;
cout<<"a = "<<a<<"\tb = "<<b<<endl;
cout<<"Subtract(a,b) = "<<Subtract(a, b)<<endl;
cout<<"Multiply(a,b) = "<<Multiply(a, b)<<endl;
cout<<"Division(a,b) = "<<Division(a, b)<<endl;
- 只用+操作实现 -,*,/操作
- 算法:只用位操作实现+、-、*、/、幂次运算
- 趣题:只用赋值、自增和循环操作实现减法运算
- “只用赋值、加1、循环三个操作实现一个减1的运算。
- 数据结构——只用赋值、自增和循环操作实现减法运算
- 只用赋值、加1、循环三个操作实现一个减1的运算
- 只用赋值、加1、循环三个操作实现一个减1的运算
- 只用递归函数和栈操作实现一个栈的逆序
- 程序员面试金典: 9.7位操作 7.4只用加号实现整数的乘法、减法和除法运算
- javascript 操作数组的万能函数,只用一个足以
- [Happy Coding] 只用BIT操作,求解整型和浮点数的绝对值
- 只用getchar实现fgets功能
- listbox实现拖放操作
- Lucene多线程操作实现
- 字符串操作的实现
- 循环队列操作实现
- jml实现msn操作
- 单链表的操作实现
- ORA-01123:无法启动联机备份;未启用介质恢复(错误分析)
- uva 993 - Product of digits
- 计算机网络基础知识 四
- V4L2驱动编写入门学习
- java对象的深拷贝浅拷贝
- 只用+操作实现 -,*,/操作
- 读《C专家编程》有感
- 3.关于非模式对话框(编程笔记)
- ZOJ 3543 Number String
- SQL Server分页存储过程
- Android之dip、dp、px、sp和屏幕密度
- java中的权限修饰符
- HDU 1086 You can Solve a Geometry Problem too
- 读《c专家编程》有感