12_1求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253932.html 

声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。

题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for, 内嵌汇编递归第三方函数。

  在网上看到一些网友给出了一些思路,比我自己想到的要好,再此深表感谢,实现如下:

java实现源码:

 1 package com.interview;
 2 /**
 3  * 题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b,  while for,
 4  * 内嵌汇编递归第三方函数。
 5  * @author wjh
 6  *
 7  */
 8 public class _12_2MinData {
 9
10     public static void main(String[] args) {
11         int a= 255;
12         int b= 30;
13         System.out.println(a+"与"+b+"中较小的数为:"+min(452, 28));
14     }
15
16     //比较的函数,用于返回两个整数的较小值
17     private static int min(int a, int b)
18     {
19         int sum = a + b;        //先算两者的和
20         b = a - b;
21         //1)java 中int类型的数据占4字节,下面的size=4
22         //2)如果a > b,那么得到b=a-b是正值,那么下一行(b>>(size*8 - 1))将等于0,否则为-1
23             //那么该语句可简化为a+=b*0(b为a和b的差值),因此得到a就是较大值
24         //3)如果a < b,根据上面的解释,那么(b>>(size*8 - 1))将等于-1,
25             //那么该语句可简化为a+=b*(-1)(b为a和b的差值),因此得到a就是较大值;
26         a += b * (b >> 4 * 8 - 1);
27         return sum - a;     //用和减去较大值,得到较小值
28     }
29 }

运行结果:

255与30中较小的数为:28

时间: 2024-12-27 08:33:33

12_1求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for的相关文章

【c语言】求两个整数中的较大者

// 求两个整数中的较大者 #include <stdio.h> int max( int a, int b ) { int temp; if( a > b ) { temp = a; } else { temp = b; } return temp; } int main() { int a,b; printf("请输入要比较的两个数:\n"); scanf("%d %d",&a,&b); printf("大数是:%d\

求两个整数的最大公约数

<C和指针>第7章第2道编程题: 两个整型值M和N(M.N均大于0)的最大公约数可以按照下面的方法计算: 请编写一个名叫gcd的函数,它接受两个整型参数,并返回这两个数的最大公约数.如果这两个参数中的任何一个不大于零,函数返回零. 1 /* 2 ** 求两个整数的最大公约数 3 */ 4 5 #include <stdio.h> 6 7 int gcd( int M, int N ); 8 9 int 10 main() 11 { 12 int m, n; 13 scanf( &q

欧几里得算法求两个整数的最大公因数

unsigned int Gcd (unsigned int m,unsigned int n){ unsigned int rem; while(n>0){ rem = m % n; m = n; n = rem; } return m; } 对于m<n的情况,第一次循环m,n会交换 算法的时间复杂度计算 时间复杂度 logn 若M > N,则第一次循环交换M和N. 若想分析其时间复杂度,则要求循环次数,即生成余数的次数. 可以证明: 当M > N, 则M % N < M

数据结构——算法之(032)(求两个串中的第一个最长子串)

[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:[email protected]] 题目: 求两个串中的第一个最长子串(神州数码曾经试题).如"abractyeyt","dgdsaeactyey"的最大子串为"actyey". 题目分析: 1.这里仅仅是实现了简单的字符串算法(最大支持字符串长度64),主要是展示算法思想 2.思路是把2个字符串每一个字符的匹配关系,映射到一张二维数组表中,匹配写1,非匹配写0 算法实现

求两个整数的最大公约数和最小公倍数

//求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ascNum(int *p1,int *p2) { int temp; if(*p1 > *p2) { temp = *p2; *p2 = *p1; *p1 = temp; } } //求两个整数的最大公约数 辗转相除法 int getAppr(int a, int b) { int c; ascNum

002:求两个整数的最大公约数和最小公倍数

求最大公约数可采用辗转相除法,其流程如图所示. 最小公倍数就是两个整数的乘积除以其最大公约数. 1 #include <stdio.h> 2 3 int main() 4 { 5 unsigned long a, b, c=0; //两个整数和临时变量 6 unsigned long lcm=0, gcd=0; //最小公倍数和最大公约数 7 8 while( 1 ) 9 { 10 printf("Please input two positive integers(spacebar

C语言求两个函数中的较大者的MAX函数

//求两个函数中的较大者的MAX函数 #include <stdio.h> int main(int argc, const char * argv[]) { printf("input two nimbers\n"); int max(int x,int y); int a, b,c; scanf("%d,%d,",&a,&b); c=max(a,b); printf("max=%d\n",c); printf(&q

求两个整数的乘积

// 求两个整数的乘积#include<stdio.h>int product (int,int);int main(void) { int x,y,s; scanf("%d %d",&x,&y); s = product(x,y); printf("The mul is:%d",s); return 0;}int product(int a,int b){ int mul; mul = a*b; return mul;} 原文地址:ht

输入两个整数,要求输出其中值较大者。要求用函数来找大数。

/* p176 例7.2 输入两个整数,要求输出其中值较大者.要求用函数来找大数. (1)函数名:应是见名知意,反应函数的功能,今定名为max (2)函数的类型:由于给定的两个数是整数,显然其中大者也是整数,也就是说max函数的值(即返回主调函数的值)应该是整型. (3)max函数的参数个数和类型:max函数应当有两个参数,以便从主函数接受两个整数,显然,参数的类型应当是整型. 在调用max函数时,应当给出两个整数作为实参,传给max函数中的两个形参*/ //编写程序: //(1)先编写max函