四个算法笔试题(一)

   本周参加了一次笔试,四个算法设计题,当时什么都不会,回来研究了两天,下面为研究结果:

1、判断一个整数是否是素数[size=medium]

   当时连素数的概念都不知道了,于是当成奇数去写了,真是惭愧啊

/**算法设计:
*素数是指只能被 1 和它本身整除的数字,那么,从 2 到 N-1 之间,如果有任何一个数能*整除 N ,则 N 就不是素数,所以只需要对 N 从 2 到 N-1 进行循环取整即可。但是,只*需要判断到 N/2 就可以了,甚至只需要判断到 N 开平方即可,原因:假设 i*i=N,如果 *N 能被整除,那么其中一个数肯定小于 i ,另一个肯定大于 i ,或者直接就是 i 。
*另外,因为 1 不是素数,所以提前将 1 排除。
*/
public boolean isPrime(int n){
   //1不是素数
   if(n<=1){
      return false;
   }else{
      for (int i = 2; i <= Math.sqrt(n); i++) {
      //如何一时间忘了开平方怎么写,可以循环到n/2
      //for(int i=2;i<=n/2;i++){
         if(n%i==0){
             return false;
         }
      }
   }
   return true;
}

2、用二分查找法从一个整数数组中查找任意一个整数,如果存在,返回它在该数组中的位置,如果不存在,返回-1
/**
*说明:这个数组必须是有序的,因为对一个无序数组进行二分查找是没有任何意义的
*算法设计:
*1:设置一个低标志位low,一个高标志位high,一个中间标志位middle,将查找范围定为*整个数组,low为数组的最小下标,high为最下标,middle=(low+high)/2
*2:将 N 与数组中middle标志位的值进行比较,如果相等,则返回middle
*3:如果 N 小于middle标志位的值,则将查找范围定为数组的前半部分,将高标志位移至 *中间标志位的前一位,即high=middle-1
*4:如果 N 大于middle标志位的值,则将查找范围定为数组的后半部分,将低标志位移至
*中间标志位的后一位,即low=middle+1
*5:只要low小于high,则一直执行前3个步骤,如果low大于high,则表示该值不在数组中
*/

//非递归写法
public int binarySearch(int[] arr,int n){
    int low = 0;
    int high = arr.lenght;
    while(low < high){
       int middle = (low + high)/2;
       if(n == arr[middle]){
           return middle;
       }else if(n < arr[middle]){
           high = middle-1;
       }else{
           low = middle + 1;
       }
    }
     return -1;
}

//递归写法
public int binarySearch(int[] arr,int n,int low,int high){
  if(low > high){
     return -1;
  }
  int middle = (low + high)/2;
  if(n == arr[middle]){
     return middle;
  }else{
     if(n < arr[middle]){
        return binarySearch(arr,n,low, middle-1);
     }else{
        return binarySearch(arr,n,middle+1,high);
     }
  }

}[/size][/size][/size][/size]

你可能感兴趣的:(算法,判断素数,二分查找递归和非递归实现)