求两个整型数的平均数

求两个整型平均数,简单吧!简单吗?

入门级:加、除

简单!

int getAverage(int input1, int input2) {

    int average = (input1 + input2) / 2;

    return average;

}

这样一个求平均数的方法拿去做大学编程题基本够用了,但是,还不够美!

进阶级:加、位

我们知道,2的指数级的乘、除运算,实质是在做移位运算,所以我们可以试着把除2变成右移1位,于是有:

int getAverage(int input1, int input2) {

    int average = (input1 + input2) >> 1;

    return average;

}

用上位操作瞬间就感觉逼格高了有没有,哈哈,不过别高兴的太早,这个方法处理“正常” 的int数没有问题,但当input1+input2的值溢出时(<Integer.MIN_VALUE or >Integer.MAX_VALUE),就处理不了了,但是如果我们能确定input始终不为负(比如数组下标),我们可以用无符号右移(>>>)代替有符号右移(>>),而且这样可以避免掉input之和溢出的问题,因为无符号右移只会在左侧空位补0。综上所述,当确定input必为非负时,我们有如下比较强壮的实现:

int getAverage(int input1, int input2) {

    int average = (input1 + input2) >>> 1;

    return average;

}

高级:位、加

讲到这里你可能会问,难道没有一种完美的方法解决上面说的input和为负数或溢出的问题吗?答案是,有!请看:

int getAverage(int input1, int input2) {

    int average = (input1 & input2) + ((input1 ^ input2) >> 1);

    return average;

}

可以看到,虽然计算公式变复杂了,但是健壮性得到了质的提升!

时间: 2024-11-05 17:23:17

求两个整型数的平均数的相关文章

找出两个整型数组中的公共元素的最大值

一,问题描述 给定两个整型数组,找出这两个数组中的最大的公共元素.注意条件:①公共元素   ②最大的公共元素 比如:arr1={8,2,9,6,18,7,25,28}   arr2={6,39,4,9,25,18,36,12}.假设 arr1 的长度为M,arr2的长度为N 这两个数组的最大公共元素是:25 二,思路 ①对 arr1 中的每个元素arr1[i],去 arr2 查找是否也存在 该元素,若存在则标记起来,因为它虽然是公共的,但不一定是最大的. 直到扫描完arr1中的所有元素,这种方式

查找两个整型数组的公共元素

一,问题描述 给定两个整型数组,假设一个长度为M,另一个长度为N.请找出(打印出)这两个数组中的公共元素. 二,算法分析 有两种思路求解这个问题. ①使用一个HashSet保存第一个数组中的所有元素,然后遍历第二个数组中的每个元素,判断该元素是否在HashSet中.如果在,就表明这个元素是公共元素. 此方法的时间复杂度为O(M+N),空间复杂度为O(M)[假设第一个数组长度为M,保存在HashSet中]. ②首先对两个数组进行排序.然后分别设置两个指针 i, j   初始时,分别指向两个数组的第

数组问题(三)求二维整型数组最大联通子数组的和

相较于上次求最大子矩阵的和,这次明显更难了一些. 将问题分解并分析,可以想到 先求各行中的最大子数组,并记录下标,求完之后再将各行的最大子数组的下标进行比较可以得到两种情况 1.上一行的最大子数组下标范围和下一行的最大子数组下标范围有重合的部分. 2.上一行的最大子数组下标范围和下一行的最大子数组下标范围无重合的部分. 程序代码: #include<iostream> using namespace std; int calculate(int n,int a[],int &sm,in

一个整型数组里除了两个不同数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。

曾经做过一道水题找出除了一个数字之外,其他数字都有2个.直接异或 最后结果就是那个数. 现在变成存在2个不一样的数字,假设成x,y,那么可以O(n)求出x^y,因为x,y不同,所以异或的结果不为0,看成2进制数,那么找到第一位为1 的位置,将这个位置设置为划分点,数组里所有这个位置为1 的异或一次,所有为0的再异或一次,最终求出的两个即为两个独特的数字. #include <stdio.h> #include <string.h> #include <algorithm>

(31-33)判断两个实型数据是否相等,求一元二次方程的根,逻辑型数据

(31)判断两个实型数据是否相等 1.abs求一个整型数据的绝对值,fabs,求一个浮点型数据的绝对值 (32)求一元二次方程的根 #include<stdio.h>#include<math.h>int main(void){ double a,b,c,d; printf("请依次输入二元一次方程的洗漱:\n"); scanf("%lf%lf%lf",&a,&b,&c); if (a==0) { printf(&qu

编程之美-----在一个整型数组里找出只出现过一次的那两个数

一.一个数组里除了一个数字之外,其他的数字都出现了两次 用异或来解 #include <iostream> using namespace std; int main() { int T; int n,m; while(cin>>T,T){ cin>>n; while(--T){ cin>>m; n=m^n; } printf("%d\n",n); } return 0; } 扩展: 一个整型数组里除了两个数字之外,其他的数字都出现了两次

求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { public static void main(String[] args) { /** * 2.求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123, * 相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0. * 方法是先将整型数字转换到数组中,再判断.

逻辑题(一)一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。

package test; import java.util.*; public class test17 { public static void main(String[] args) { //一个整型数组里除了两个数字之外,其他的数字都出现了两次. // 请写程序找出这两个只出现一次的数字. int[] ints = {1,1,2,5,5,6,3,3}; Map<Integer, Integer> map = new HashMap<Integer, Integer>();

剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

/*一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. */ import java.util.*; public class Class45 { public void FindNumsAppearOnce(int[] array, int num1[], int num2[]){ ArrayList<Integer> list = new ArrayList<Integer>(); Arrays.sort(array); for(int