1. 程式人生 > >不用”if“,”?:“,”switch“或其他判斷語句,求兩個數中較大的數或較小的數

不用”if“,”?:“,”switch“或其他判斷語句,求兩個數中較大的數或較小的數

以下五種方法分別求出較大的數和較小的數的方法。較小數的程式碼在註釋中,但未執行測試。

int Find1(int a, int b) {
	return ((a + b) + abs(a - b)) / 2;
	//return ((a + b) - abs(a - b)) / 2;
}

/*
當a大於b時,a-b為正,右移sizeof(int) * 8 - 1後,最右側一位為0,0^1 = 0;
當a小於b時,a-b為負,右移後最右側一位為1,1^1 = 1
*/
int Find21(int a, int b) {
	int c[2] = {a, b};
	int z = a - b;
	z = (z >> (sizeof(int) * 8 - 1)) & 1;
	return c[z];
	/*
	int c[2] = {b, a};
	int z = a - b;
	z = (z >> (sizeof(int) * 8 - 1)) & 1;
	return c[z];
	*/
}

int Find22(int a, int b) {
	int flag = ((a - b) >> (sizeof(int) * 8 - 1)) & 1;
	return (a - (a - b) * flag);
	//return (b - (b - a) * flag);
}

int Find3(int a, int b) {
	int c[2] = {a, b};
	return c[a < b];
	//return c[a > b];
}

    /* 
	該方法對於兩個數均為負數的情況以及有數為0的情況
	沒法處理,但這裡也列出該方法。
    a<b時,a/b=0,所以被除數為b*(b/a),除數為b/a,結果是b 
    a=b時,a/b=1,所以被除數為a+b=2a,除數為2,結果是a 
    a>b時,b/a=0,所以被除數為a*(a/b),除數為a/b,結果是a 
    */  
    int Find4(int a, int b)  
    {  
        int larger = (a*(a/b) + b*(b/a))/(a/b + b/a);  
        //long smaller = (b*(a/b) + a*(b/a))/(a/b + b/a);  
        return larger;  
    }  

int main() {
	int a, b;
	while (1) {
		cin >> a >> b;
		cout << Find1(a, b) << " ";
		cout << Find21(a, b) << " ";
		cout << Find22(a, b) << " ";
		cout << Find3(a, b) << " ";
		cout << Find4(a, b) << endl;
	}
}