/*
网上很多都没说清楚到底出题人是什么用意,用意就是既要又要,既要不溢出,又要不丢失精度.所以就分开处理,在丢失之前把丢失的部分保存下来,然后两部分算好再相加.
可以先看一下我的2.79题 用的是先乘后除 会溢出 符合题意
2.80要求的是先除后成 不会溢出 但会丢失精度
核心思路:按照书本上的公式除以4会导致x丢失2位使结果错误(如果先乘的话可以避免,但会导致溢出不符合题意),x=-3时 (x = x + (1 << 2) - 1)等于0,x=2时,x=x>>2;等于0.(再次强调我们先除以4所以这两个式子等于0)
所以我们在除之前先把会丢失的那两位保存到xx.
x用先除后乘,防止溢出,让它丢失后两位,当x只有2位时,丢弃后值会等于0
xx用先乘后除,因为只有两位所以不会溢出,
x+xx就是我们的答案
*/
#include <stdio.h>
#include <limits.h>
int threefourths(int x);
int main()
{
printf("3result=\t%d\n",threefourths(3));
printf("-3result=\t%d\n",threefourths(-3));
printf("150result=\t%d\n",threefourths(150));
printf("-150result=\t%d\n",threefourths(-150));
printf("-10result=\t%d\n",threefourths(-10));
return 0;
}
int threefourths(int x)
{
int xx = x&0x3;
int is_neg = x & INT_MIN;
(is_neg && (xx = ((-x)&0x3)));
(is_neg && (x = x + (1 << 2) - 1));
x=x>>2;
xx=(((xx<<1)+xx)>>2);//xx只有两位先乘后除不会溢出.
(is_neg && (xx = -xx));
return (x<<1)+x+xx;
}