JAVA经典算法(31-40)

JAVA经典算法42例

    • 【31.数组逆序输出】
    • 【32.取一个整数a从右端开始的4~7位】
    • 【33.杨辉三角】
    • 【34.三个数排序】
    • 【35.数组最大之交换】
    • 【36.简单排序】
    • 【37.约瑟夫问题】
    • 【38.求一个字符串的长度】
    • 【39.字符串排序】
    • 【40.猴子吃桃子2】

【31.数组逆序输出】

题目:将一个数组逆序输出。
程序分析:用第一个与最后一个交换。
其实,用循环控制变量更简单:

   for(int k=11;k>=1;k--)
			  System.out.print(myarr[k]+",");

【32.取一个整数a从右端开始的4~7位】

题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用(0 < <4)
(3)将上面二者进行&运算。

public class Ex32 {
  public static void main(String[] args)
  {
	int a=0;
	long b=18745678;
	a=(int) Math.floor(b % Math.pow(10,7)/Math.pow(10, 3));
	System.out.println(a);
  }
  }

【33.杨辉三角】

题目:打印出杨辉三角形(要求打印出10行如下图)
1.程序分析:

1   
1   1   
1   2   1   
1   3   3   1   
1   4   6   4   1   
1   5   10   10   5   1   
public class Ex33 {
	public static void main(String args[]){
		   int i,j;
		   int a[][];
		   a=new int[8][8];
		  for(i=0;i<8;i++){
		     a[i][i]=1;
		     a[i][0]=1; 
		    }
		  for(i=2;i<8;i++){
		   for(j=1;j<=i-1;j++){
		  a[i][j]=a[i-1][j-1]+a[i-1][j]; 
		   }
		  }  
		  for(i=0;i<8;i++){
		  for(j=0;j<i;j++){  
		   System.out.printf("  "+a[i][j]);
		   }
		  System.out.println();
		  }
		 }
}

【34.三个数排序】

题目:输入3个数a,b,c,按大小顺序输出。
1.程序分析:利用指针方法。

public class Ex34 {
	public static void main(String[] args) 
	{ 
	int []arrays = {800,56,500}; 
	for(int i=arrays.length;--i>=0;) 
	{ 
	for(int j=0;j<i;j++) 
	{ 
	if(arrays[j]>arrays[j+1]) 
	{ 
	int temp=arrays[j]; 
	arrays[j]=arrays[j+1]; 
	arrays[j+1]=temp; 
	} 
	} 
	} 
	for(int n=0;n<arrays.length;n++) 
	System.out.println(arrays[n]); 
	} 

}

【35.数组最大之交换】

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

import java.util.*; 
public class Ex35 {
public static void main(String[] args) { 
int i, min, max, n, temp1, temp2; 
int a[]; 
System.out.println("输入数组的长度:"); 
Scanner keyboard = new Scanner(System.in); 
n = keyboard.nextInt(); 
a = new int[n]; 
for (i = 0; i < n; i++) { 
System.out.print("输入第" + (i + 1) + "个数据"); 
a[i] = keyboard.nextInt(); 
} 
//以上是输入整个数组
max = 0; 
min = 0; 
//设置两个标志,开始都指向第一个数
for (i = 1; i < n; i++) { 
if (a[i] > a[max]) 
max = i; //遍历数组,如果大于a[max],就把他的数组下标赋给max
if (a[i] < a[min]) 
min = i; //同上,如果小于a[min],就把他的数组下标赋给min
} 
//以上for循环找到最大值和最小值,max是最大值的下标,min是最小值的下标
temp1 = a[0]; 
temp2 = a[min]; //这两个temp只是为了在交换时使用

a[0] = a[max]; 
a[max] = temp1; //首先交换a[0]和最大值a[max]

if (min != 0) { //如果最小值不是a[0],执行下面
a[min] = a[n - 1]; 
a[n - 1] = temp2; //交换a[min]和a[n-1]
} else {       //如果最小值是a[0],执行下面
a[max] = a[n - 1]; 
a[n - 1] = temp1; 
} 

for (i = 0; i < n; i++) { //输出数组
System.out.print(a[i] + " "); 
} 
}
}

【36.简单排序】

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

【37.约瑟夫问题】

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

import java.util.Scanner;
public class Ex37 {
	public static void main(String[] args) {
		   Scanner s = new Scanner(System.in);
		   int n = s.nextInt();
		   boolean[] arr = new boolean[n];
		   for(int i=0; i<arr.length; i++) {
		    arr[i] = true;//下标为TRUE时说明还在圈里
		   }
		   int leftCount = n;
		   int countNum = 0;
		   int index = 0;
		   while(leftCount > 1) {
		    if(arr[index] == true) {//当在圈里时
		     countNum ++; //报数递加
		     if(countNum == 3) {//报道3时
		      countNum =0;//从零开始继续报数
		      arr[index] = false;//此人退出圈子
		      leftCount --;//剩余人数减一
		     }
		    }
		    index ++;//每报一次数,下标加一
		    if(index == n) {//是循环数数,当下标大于n时,说明已经数了一圈,
		     index = 0;//将下标设为零重新开始。
		    }
		   }
		   for(int i=0; i<n; i++) {
		    if(arr[i] == true) {
		     System.out.println(i);
		    }
		   }
     }
}

【38.求一个字符串的长度】

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

import java.util.Scanner;
public class Ex38 {
public static void main(String [] args)
{
	Scanner s = new Scanner(System.in);
	System.out.println("请输入一个字符串");
	String mys= s.next();
	System.out.println(str_len(mys));
}
  public static int str_len(String x)
  {
	  return x.length();
  }
}

【39.字符串排序】

题目:字符串排序。

import java.util.*;   
public class test{
	public   static   void   main(String[]   args)
	{   
     ArrayList<String> list=new ArrayList<String>();   
     list.add("010101");   
     list.add("010003");   
    list.add("010201");   
    Collections.sort(list);   
  for(int   i=0;i<list.size();i++){   
  System.out.println(list.get(i));   
  }   
  }   
  }

【40.猴子吃桃子2】

题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

public class Dg {
static int ts=0;//桃子总数
int fs=1;//记录分的次数
static int hs=5;//猴子数...
int tsscope=5000;//桃子数的取值范围.太大容易溢出.
public int fT(int t){
if(t==tsscope){
//当桃子数到了最大的取值范围时取消递归
System.out.println("结束");
return 0;
}
else{
if((t-1)%hs==0 && fs <=hs){
if(fs==hs)
{
System.out.println("桃子数 = "+ts +" 时满足分桃条件");
}
   fs+=1;
   return fT((t-1)/5*4);// 返回猴子拿走一份后的剩下的总数
}
else
{
//没满足条件
fs=1;//分的次数重置为1
return fT(ts+=1);//桃子数加+1
}
}
}
public static void main(String[] args) {
new Dg().fT(0);
}

}

你可能感兴趣的:(java基础)