-
问题内容:不用+,-,*,/,自行设计整数的四则运算函数add(),sub(),multi(),div()
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=3721076
- 所属论坛:数据结构与算法
审核组:其他
- 提问者:Disaster
解决者:taolei
- 感谢:taolei
- 关键字:专题开发/技术/项目 数据结构与算法
- 答案:
这是一道华为试题,哪位大哥帮我解决一下
我们一直算术中的四则运算在高级语言中有相应的运算符号+,-,*,/,现在请你运用已经学过的知识,自行设计整数的四则运算函数add(),sub(),multi(),div()来实现相应的计算(在函数中不能使用+,-,*,/)
如add(3,5)返回8,sub(4,1)返回3,multi(2,7)返回14,div(1,3)返回0.3(在divz()函数中程序不可使用实形变量)
---------------------------------------------------------------
int add(int a,int b)
{
int r = 0;
int c = 0;
for(int i=1;i != 0;i<<=1)
{
r |= (a^b^c) & i;
c = (((a&b) | (b&c) | (a&c)) & i)<<1;
}
return r;
}
int sub(int a,int b)
{
int r =0;
int c= 0;
for(int i=1;i!=0;i<<=1)
{
r |= (a^b^c) & i;
c = ((~a&(b|c)) | (a&b&c))<<1;
}
return r;
}
int mul(int a,int b)
{
int r = 0;
for(int i=1;i!=0;i<<=1,a<<=1)
{
if (b & i)
r = add(r,a);
}
return r;
}
float div(int a,int b)
{
int r = 0;
if (b == 0)
{
if (a == 0)
{
r = 0xffc00000;//-1.#IND0
}
else
{
if(a < 0)
r = 0xff800000;//-1.#INF0
else
r = 0x7f800000;//1.#INF0
}
}
else if(a != 0)
{
int sign = 0;
if (a < 0)
{
sign =1;
a = -a;
}
if (b < 0)
{
sign ^= 1;
b = -b;
}
int ext = 127;
int bit = 0x40000000;
while((a&bit)==0)
{
a <<= 1;
ext = sub(ext,1);
}
while((b&bit)==0)
{
b <<=1;
ext = add(ext,1);
}
unsigned x = (unsigned)a;
unsigned y = (unsigned)b;
if (x < y)
{
ext = sub(ext,1);
x<<=1;
}
for(bit=1<<23;bit>0;bit>>=1)
{
r <<= 1;
if (x >= y)
{
x = sub(x,y);
r |= 1;
}
x <<= 1;
}
if (x >= y)
{
r = add(r,1);
if ((r & 0x1000000) != 0)
{
ext = add(ext,1);
r >>=1;
}
}
r = (sign << 31) | (ext<<23) | (r & 0x7fffff);
}
return *(float*)&r;
}
- 评价:
给朵鲜花(56)
扔个鸡蛋(18)