【java】よくある簡単なアルゴリズム

package com.aowin.test;

import java.util.Random;
import java.util.TreeSet;
import java.util.*;

public class Test {
	public static void main(String[] args) {
		
		//System.out.println(rabbit(7));
		//letter();
		//test3();
		//test4(19);
		//System.out.println(test5(16,19)); 
		//test6();
		//System.out.println(test7(2,4));
		
		//System.out.println(test9(10)); 
		//test10();
		//test11();
		//test12();
		//System.out.println(test13(9));
		//test14(10);
		//test18(4);
		//yang(10);
		test20();
		
		
	}
	
	//1、古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
	public static int rabbit(int n){		
		if(n==1||n==2){
			return 1;
		}else{		
			return rabbit(n-1)+rabbit(n-2);
		}
	}
	
	//2、随机产生20个不重复的小写字母并且排序?
	public static void letter(){
		Random rand = new Random();
		TreeSet<Character> ts = new TreeSet<Character>();
		
		while(ts.size()<20){
			int n = rand.nextInt(26);   //产生0~25中间的一个随机数
			char ch = (char)(n+97);		//转换成a~z之间的一个字母
			ts.add(ch);
		}
		
		System.out.println(ts); 		
	}
	
	//3.判断101-200之间有多少个素数,并输出所有素数。
	public static void test3(){
		int count =0;
		for(int i=101;i<=200;i++){
			if(isPrime(i)){
				System.out.println(i+"是素数");
				count++;
			}
		}
		System.out.println("共有"+count+"个");
	}

	private static boolean isPrime(int x) {
		boolean flag = true;  //true表示是素数
		for(int k=2;k<x;k++){
			if(x%k==0){
				flag=false;
				break;
			}
		}
		return flag;
	}
	
	//4.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
	public static void test4(int x){
		
		int k=2;
		while(true){
			if(x%k==0){
				System.out.println(k);
				x = x/k;
				k=2;
			}else{
				k++;
			}
			if(x==1)
				break;
		}		
	}
	
	//5.输入两个正整数x和y,求其最大公约数. 
	public static int test5(int x,int y){
		
		int m = x>y?x:y;   	//x,y中较大的数
		int n = x<y?x:y;	//x,y中较小的数
		
		while(true){
			if(n==0){
				return m;
			}else{
				int tmp = m%n;
				m=n;
				n=tmp;				
			}		
			
		}	
		
	}
	
	//6输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数.
	public static void test6( ){
		
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入任意的字符:"); 
		String str = scan.nextLine();
		int count_en=0;
		int count_space = 0;
		int count_digit = 0;
		int count_other = 0;
		
		for(int i =0;i<str.length();i++){
			char ch = str.charAt(i);
			if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'){
				count_en++;
			}else if(ch>='0'&&ch<='9'){
				count_digit++;
			}else if(ch==32){
				count_space++;
			}else{
				count_other++;
			}
		}
		
		System.out.println("英文字母:"+count_en); 
		System.out.println("空格:"+count_space); 
		System.out.println("数字:"+count_digit); 
		System.out.println("其它:"+count_other); 		
	}
	
	//7求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制.

	public static int test7(int a, int n){
		int sum=0;
		int x=0;
		for(int i=0;i<n;i++){
			x=x*10+a;    
			sum+=x;
		}
		return sum;
		
	}
	//8一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程找出1000以内的所有完数
	
	//9、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
	public static double test9(int n){      
		if(n==1){
			return 50.0;
		}else{		
			return test9(n-1)/2;    //第n次反弹的高度
		}		
	}
	
	//10、有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
	public static void test10(){
		int count=0;
		for(int i=1;i<=4;i++){			
			for(int j=1;j<=4;j++){
				if(j==i)
					continue;				
				for(int k=1;k<=4;k++){
					if(k==i||k==j)
						continue;
					int a=100*i;
					a+=j*10;
					a+=k;
					System.out.println(a);
					
					count++;
					
				}
			}
		}
		System.out.println("共有:"+count); 
	}
	
	//11、在1-1000内有一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
	public static void test11(){
		for(int i=1;i<=1000;i++){
			if(Math.sqrt(100+i)%1==0&&Math.sqrt(100+i+168)%1==0)
				System.out.println(i); 
		}
	}
	
	//12、输入某年某月某日,判断这一天是这一年的第几天?
	public static void test12(){
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入年:");
		int year = scan.nextInt();
		System.out.println("请输入月:");
		int month = scan.nextInt();
		System.out.println("请输入日:");
		int day = scan.nextInt();
		
		if(month==1){
			System.out.println("第"+day+"天");
		}else{
			int sum=0;
			for(int i=1;i<month;i++){
				switch(i){
				case 1:
					sum+=31;
					break;
				case 2:
					sum+=isLeapYear(year)?29:28;
					break;
				case 3:
					sum+=31;
					break;
				case 4:
					sum+=30;
					break;
				case 5:
					sum+=31;
					break;
				case 6:
					sum+=30;
					break;
				case 7:
					sum+=31;
					break;
				case 8:
					sum+=31;
					break;
				case 9:
					sum+=30;
					break;
				case 10:
					sum+=31;
					break;
				case 11:
					sum+=30;
					break;
				case 12:
					sum+=31;
					break;
					
				}
			}
			
			System.out.println("第"+(sum+day)+"天");
		
		}
		
	}

	private static boolean isLeapYear(int year) {
		if(year%4==0&&year%100!=0||year%400==0)
			return true;
		return false;
	}
	
	//13猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
	public static int test13(int n){
		if(n==10){
			return 1;
		}else
		{
			return (test13(n+1)+1)*2;
		}	
		
	}
	
	//14打印图形
	public static void test14(int n){
		
		//打印行数
		int line = 2*n-1;
		
		for(int k=0;k<line;k++){
			//*的数目
			int num=0;
			if(k<n)
				num = 2*k+1;
			else
				num = 2*(n-1)+1-2*(k-(n-1));
			//空格的数目
			int num2=0;
			if(k<n)
				num2 = n-k-1;
			else
				num2 = k-n+1;			
			
			for(int m=0;m<num2;m++){
				System.out.print(" ");
			}				
				
			for(int m=0;m<num;m++){
				System.out.print("*");
			}
			System.out.println();
 		}
		
		
	}
	
	//18.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
	public static void test18(int x){
		int[] arr = {3,5,7,11};
	
		int[] brr = new int[arr.length+1];
		System.arraycopy(arr, 0, brr, 0, arr.length); 
		
		for(int i=0;i<arr.length;i++){
			if(x<brr[i]){
				int tmp = brr[i];
				brr[i] = x;
				x = tmp;
			}
		}
		brr[arr.length]=x;
		
		for(int i:brr){
			System.out.print(i+","); 
		}
		
	}
	
	//19打印出杨辉三角形
	public static void yang(int n){
		int[] arr = {1};
		space(n);
		print(arr);		
		int count=1;
		while(count<n){
			int[] brr = new int[arr.length+1];
			for(int i=0;i<brr.length;i++){
				if(i==0){
					brr[i]=arr[0];
				}else if(i==brr.length-1){
					brr[i]=arr[arr.length-1];
				}else{
					brr[i]=arr[i-1]+arr[i];
				}				
			}
			space(n-count);
			print(brr);
			count++;
			arr=brr;			
		}
		
		
	}

	private static void space(int n) {
		for(int i=0;i<n;i++){
			System.out.print(" ");
		}
		
	}

	private static void print(int[] arr) {
		for(int i:arr){
			System.out.print(i+" "); 
		}
		System.out.println();
	}
	
	//20输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组.
	public static void test20(){
		
		int[] arr= {30, 86, 33, 56, 57, 82, 36, 84};
		print(arr);
		int max = arr[1];
		int ind = 1;
		for(int i=2;i<arr.length;i++){
			if(arr[i]>max){
				max = arr[i];
				ind = i;
			}
		}
		
		if(max>arr[0]){
			arr[ind]=arr[0]; 
			arr[0]=max;
		}
		
		int min=arr[1];
		int ind1 = 1;
		for(int i=2;i<arr.length-1;i++){
			if(arr[i]<min){
				min = arr[i];
				ind1 = i;
			}
		}
		if(min<arr[arr.length-1]){
			arr[ind1] = arr[arr.length-1];
			arr[arr.length-1]=min;
		}
		
		print(arr);
		
		
	}
	
	
	
}

************求两个整数的最大公约数和最小公倍数**********
public class Work4 {
	public static void main(String[] args) {
		Random rand = new Random();
		int a = rand.nextInt(100)+1;
		int b = rand.nextInt(100)+1;
		int m = a<b?a:b;
		int n = a>b?a:b;
		int x;
		for(x = m;x>=1;x--){
			if(m%x==0&&n%x==0){
				System.out.println(x+"是"+m+"和"+n+"的最大公约数");
				break;
			}
		}
		
		System.out.println(m*n/x); 
	}
	
}


//5.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13......求出这个数列的前20项的和
public class Work5 {
	public static void main(String[] args) {
		double a=2;
		double b=1;
		
		double sum = a/b; 
		
		for(int i=1;i<=19;i++){
			double tmp=a;
			a=a+b;
			b=tmp;
			sum+=a/b;
		}
		System.out.println("sum="+sum); 

	}

}

6.一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程找出1000以内的所有完数
public class Work6 {
	public static void main(String[] args) {
		for(int i=1;i<=1000;i++){
			//找出i的因子
			int sum=0;
			for(int j=1;j<i;j++){
				if(i%j==0){
					sum+=j;     //因子累加
				}
			}
			//判断是否完数(所有因子之后与该数相等)
			if(sum==i){
				System.out.println(i+"是完数"); 
			}
		}
	}
}

***********************************************
public class Test2 {

	public static void main(String[] args) {
		//System.out.println(compare("hello","hell"));
		String[] arr = new String[]{"abc","hans","lisi","hello"};
		//sortBubble(arr);
		/*sortSelect(arr);
		for(String s:arr)
			System.out.println(s); */
		
		System.out.println(test24());
		

	}
	
	//24海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
	//第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,
	//第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
	public static int test24(){
		int num=1;     	//num:编号为i的猴子拿走的那一份桃子的数量
		int n=num;
		int i=5;		//i:猴子的编号
		int a=0;		//a:原来沙滩上桃子的数量
		while(true){
			 a = n*5+1;   //编号为i的猴子拿到的桃子总数,来源于编号i-1的猴子剩余的4份桃子
			 if(i==1)
					 break;
			 if(a%4==0){
				 i--;
				 n = a/4;
				 
			 }else{
				num++;
				i=5;
				n=num;
				System.out.println("num="+num); 
			 }			
		}		
		return a;
		
	}
	
	
	
	
	//23,字符串排序
	//冒泡排序
	public static void sortBubble(String[] arr){
		for(int i=arr.length-1;i>0;i--){
			for(int k=0;k<i;k++){
				if(!compare(arr[k],arr[k+1])){
					String tmp = arr[k];
					arr[k] = arr[k+1];
					arr[k+1] = tmp;
				}
			}
		}		
	}
	
	//选择排序
	public static void sortSelect(String[] arr){
		for(int i=0;i<arr.length-1;i++){
			int ind = i+1;
			for(int k=i+2;k<arr.length;k++){
				if(compare(arr[k],arr[ind])){
					ind = k;
				}
			}
			if(compare(arr[ind],arr[i])){
				String tmp = arr[i];
				arr[i] = arr[ind];
				arr[ind] = tmp;
			}
		}
	}	
	
	//插入排序	
	
	//两个字符串比较大小    hello   hell
	public static boolean compare(String s1,String s2){
		boolean flag = true;    //true:表示s1<s2
		int m=s1.length();
		int n = s2.length();
		int num = m<n?m:n;
		int i=0;
		while(i<num){
			if(s1.charAt(i)-s2.charAt(i)>0){
				flag=false;
				return flag;
			}else if(s1.charAt(i)-s2.charAt(i)<0){
				return flag;
			}
			i++;			
		}	
		if(i==num){
			if(m>n)
				flag=false;
		}
		return flag;
	}
	
}

おすすめ

転載: blog.csdn.net/xudahai513/article/details/126904929