基础题

1、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
public class Test08_11 {
	public static void main(String[] args) {
		int sum = 0;
		int x = 0;
		for(int a = 1; a <= 4; a++) {
			for(int b = 1; b <= 4; b++) {
				if(a == b) {
					continue;
					}
				for(int c = 1; c <= 4; c++) {
					if(a != b && a != c && a !=c && b != c) {
						sum = a * 100 + b * 10 + c;
						x++;
						System.out.println(sum);
					}
				}
			}
		}System.out.println("一共有"+x+"个。");
	}
}
由题意可知,三位数各不相同,第一位就有四种选择,第二位只有3种,第三位只有2种,可以分别把它们列出来,然后根据数字不同进行判断
2、输入某年某月某日,判断这一天是这一年的第几天?
public class Test10_14 {
	public static void main(String[] args) {
		int year = 2010;
		int month = 3;
		int day = 10;
		int sum = 0;
		if(year % 4 == 0 && year % 100 != 0) {
			int[] i = {31,29,31,30,31,30,31,31,30,31,30,31};
			for(int x = 0; x < month-1; x++) {	
				sum += i[x];
			}System.out.println("这一天是这一年的第"+(sum+day)+"天。");
		}else if(year % 400 == 0) {
			int[] i = {31,29,31,30,31,30,31,31,30,31,30,31};
			for(int x = 0; x < month-1; x++) {	
				sum += i[x];
			}System.out.println("这一天是这一年的第"+(sum+day)+"天。");
		}else {
			int[] i = {31,28,31,30,31,30,31,31,30,31,30,31};
			for(int x = 0; x < month-1; x++) {	
				sum += i[x];
			}System.out.println("这一天是这一年的第"+(sum+day)+"天。");
		}
	}

}
因为每个月的天数是不一样且没有规律的,所以把它们全部放在数组里面,需要几个月的就取几个月的!
3、打印菱形
/*
 打印出如下图案(菱形)

    *
   *** 
  ***** 
 ******* 
  ***** 
   *** 
    * 
 */
public class Test14_19 {
	public static void main(String[] args) {
		for(int i = 1; i <= 7; i++) {
			if(i <= 4) {
				for(int a = 4; a >= i; a--) {
					System.out.print(" ");
				}
				for(int b = 1; b <= 2*i-1 ; b++) {
					System.out.print("*");
				}System.out.println();
			}else{
				for(int a = 4; a <= i; a++) {
					System.out.print(" ");
				}
				for(int b = 15-2*i; b >= 1 ; b--) {
					System.out.print("*");
				}System.out.println();
			}
		}
	}
}
方法一找规律不好找可以另外重新开始一段新的逻辑!
4、使用递归计算5!
public class Test17_22 {
	public static void main(String[] args) {
		int a = 5;
		System.out.println(sum(5));
	}
	public static int sum(int a){
		if(a==1) {
			return 1;
		}
		return a * sum(a-1);
	}
}
方法递归是要返回值的,刚好的可以在这个值上面进行调用,另外要想使递归停止,可以增加一个判断;
5、使用方法递归计算有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
public class Test18_23 {

	public static void main(String[] args) {
		System.out.println(age(5));	
	}
	public static int age(int i) {
		if(i == 1) {
		return 10;
		//如果是第二个人,就是age(2-1)+2即10+2,
		//如果是第三个人,就是age(3-1)+2-->age(2-1)+2+2-->10+2+2
		//如果是第四个人,就是age(4-1)+2-->age(3-1)+2+2-->age(2-1)+2+2+2-->10+2+2+2
		//如果是第五个人,就是age(5-1)+2-->age(4-1)+2+2-->age(3-1)+2+2+2-->age(2-1)+2+2+2+2-->10+2+2+2+2
		}return age(i-1)+2;
	}

}
使用逆向思维,后面每个人是前一个人的年龄加2
6、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

import java.util.Scanner;

/*
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
 */
public class Test33_35 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10};
		System.out.println("请输入需要向后移的位数");
		int y = sc.nextInt();
		int[] arr1 = new int[y];//创建一个数组来存储往后移的数
		for(int i = 0; i < y; i++) {//将后移的几位存储在这个数组里;
			arr1[i] = arr[i];
		}
		for(int i = 0; i <= arr1.length-1; i++) {			
			System.out.print(arr[i]+" ");
		}System.out.println();
		//将未后移的移动到前面来;
		for(int i = 0; i<arr.length-y; i++) {
			arr[i] = arr[y+i];
		}
		for(int i = 0; i <= arr.length-1; i++) {			
			System.out.print(arr[i]+" ");
		}System.out.println();
		//再把两个数组进行整合
		for(int i = (arr.length-y),m = 0; i <= arr.length-1; i++,m++) {
			arr[i] = arr1[m];
		}
		
		//-------------------------------------------
		for(int i = 0; i <= arr.length-1; i++) {			
			System.out.print(arr[i]+" ");
		}
	}

}

如果要对数组进行骚操作,建议使用两个数组来搞;
7、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
import java.util.Scanner;
public class Test34_37 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		System.out.println("请输入有几个人");
		int no = sc.nextInt();
		boolean[] arr = new boolean[no];
		//给元素赋值
		for(int i = 0; i <= no-1; i++) {
			arr[i]  = true;
		}
		int a = no;//记录剩下的没有被改变的数字个数
		int b = 0;//记录所报的数
		int c = 0;//记录索引
		while(a > 1) {								//如果剩下的元素不是一个那就循环
			if(arr[c] == true) {
				b++;								//元素为true那索引加1;同时也能跳过false
				if(b==3) {
					arr[c]=false;					//如果索引为3即第三个人的时候,把值变为false
					a--;							//同时还未比较的数字就减1
					b=0;							//索引号又重新开始
				}
			}
			c++;									//索引加一进入下一次判断													
			if(c==no) {								//如果索引等于了剩下的没有比较的元素,那么就重新开始
				c=0;
			}
		}	
		//--------------------遍历数组判官最后一个true在第几号--------------------------------------
		for(int i = 0; i <= no-1; i++) {
			if(arr[i] == true) {
				System.out.print("最后留下的是原来第"+(i+1)+"号");
			}
		}

	}

}
思路:有n个人,它们一开始都是一样的,按某个规律,轮到第几人就把那人给打个标记改变一下,同时也让规律重新运行,当到最后一个人时,又跳转到第一个人,依次类推,最后只剩下一个人时,循环就可以结束,要找这个人只需要在这个数组寻找那个唯一的不同就可以。
8、海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
public class Test38_41 {
	public static void main(String[] args) {
		for(int total = 1; ;total++) {
			int fen = total;				//桃子的总个数
			int no = 1;						//定义一个辅助变量来记录猴子的个数
			for(int i = 1; i <= 5; i++) {		//循环来测试是否5只猴子都满足条件
				int yu = fen - 1;				//先丢掉一个桃子后剩余的桃子
				if(yu % 5 != 0) {				
					break;						//如果有余数那么就直接结束循环
				}else {
					fen = yu - yu/5;			//执行下次循环时的桃子数
					no++;						//如果进入下次循环就增1
				}
			}if(no == 6) {							//如果no=6意味着5只猴子条件都是满足的
				System.out.println(total);
				break;
			}
		}
	}
}
思路:先假设有一个桃子(最好是总数量一个变量,再设一个临时变量来存储桃子个数并让它来参与运算,也可以避免混乱),然后然后让这个桃子数去匹配这个条件,如果不满足条件,桃子加一个再去匹配,因为有5只猴子,所以匹配的时候要匹配5次都满足才行,如果有一次不满足,那么就要结束这个匹配,然后桃子加1,同时,为了跳出最外层循环,需要设置一个辅助变量来记录次数,如果匹配成功就加1,不成功时,归零!

另外注意:JAVA里面  int类型计算在使用“/”号时,返回的值只是整数,不会返回小数。只有当其中有一个值为浮点型时,在运算时另外一个值会自动类型转换为浮点型再进行运算,结果才会是浮点型数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值