码迷,mamicode.com
首页 > 其他好文 > 详细

J2SE习题(1)

时间:2014-09-06 06:30:42      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:乘法口决表   水仙花数   求质数   猴子选大王   

以下为java的一些常见的题

1.

bubuko.com,布布扣

代码:

package cn.wwh.www.exercise;

import java.util.Scanner;

/**
 * 类的作用:1.输出N * N的乘法口诀表
 *
 *
 * @author 一叶扁舟
 * @version 1.0
 * @创建时间: 2014年9月4日 下午6:09:08
 */
public class PrintMultTable {

	public static void main(String[] args) {
		System.out.print("请输入行数:");
		Scanner scn = new Scanner(System.in);
		int num = scn.nextInt();
		printNum(num);
	}

	/**
	 * @param inNum
	 *            控制台输入的整数
	 * 
	 */
	private static void printNum(int inNum) {
		if (inNum < 1) {
			System.out.println("输入错误!");
			return;
		}

		System.out.println("输出");
		for (int i = 1; i <= inNum; i++) {
			for (int j = 1; j <= i; j++) {
				System.out.print(j + "*" + i + "=" + (i * j) + "\t");
			}
			System.out.println();
		}

	}

}

2.

bubuko.com,布布扣


package cn.wwh.www.exercise;

import java.util.Scanner;

/**
 * 类的作用: 2.根据输入的起始数和结束数,输出这个范围的所有质数
 *
 *
 * @author 一叶扁舟
 * @version 1.0
 * @创建时间: 2014年9月4日 下午6:26:41
 */
public class PrintPrime {
	public static void main(String[] args) {
		System.out.print("请输入起始数据:");
		Scanner scn = new Scanner(System.in);
		int beginNum = scn.nextInt();
		scn = new Scanner(System.in);
		System.out.print("请输入结束数据:");
		int endNum = scn.nextInt();
		// 调用输出函数
		outPrime(beginNum, endNum);

	}

	/**
	 * @param beginNum
	 *            起始数
	 * @param endNum
	 *            结束数
	 */
	private static void outPrime(int beginNum, int endNum) {
		if (beginNum >= endNum) {
			System.out.println("输入范围错误!");
		}

		int count = 0; // 用于换行
		int sum = 0;// 所有的质数的和
		for (int i = beginNum; i < endNum; i++) {
			if (isPrime(i)) {
				System.out.print(i + "\t");
				sum = i + sum;
				if (++count % 8 == 0)
					System.out.println();

			}
		}

		System.out.println("\ncount:" + count + "\tsum:" + sum);

	}

	/**
	 * @param num
	 *            要判断的整数
	 * @return 如果i是质数则返回true,否则返回false
	 */
	private static boolean isPrime(int num) {
		boolean flag = false;
		if (num <= 1) {
			return flag;
		}
		if (num == 2) {
			return true;
		}

		for (int i = 2; i < num; i++) {
			if (num % i == 0) {
				return flag;
			}
			if (i * i >= num) {
				flag = true;
			}
		}
		return flag;
	}

}


3.

bubuko.com,布布扣

代码:

package cn.wwh.www.exercise;

import java.util.Scanner;

/**
 *类的作用:3.输出水仙花数
 *思路:例如输入一个3位数,则三位的范围是[100,1000)
 *假设判断123?
 *a>temp = 123  last = 123/1%10=3      sum = 3*3*3
 *b>temp = 12  last = 12%10 = 2         sum = sum + 2*2*2
 *c>temp = 1   last = 1%10 = 1          sum = sum + 1* 1*1 
 *
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014年9月4日   下午8:48:25
 */
public class PrintNarcissusNum {

	public static void main(String[] args) {
		System.out.print("请输入数字的位数:");
		Scanner scn = new Scanner(System.in);
		int numLength = scn.nextInt();
		System.out.println(numLength + "位数的水仙花数为:");
		// 输入的最小位数
		int begin = (int) Math.pow(10, numLength - 1);
		for (int i = begin; i < begin * 10; i++) {
			if (isNarcissus(i, numLength)) {
				System.out.print(i + "\t");
			}

		}
	}

	/**
	 * @param i
	 * @return 如果是水仙花数则返回true,否则返回false
	 */
	private static boolean isNarcissus(int num, int length) {
		int temp = 0;
		// 记录所有数字之和
		int sum = 0;
		// 记录各个位上的数字,从右向左记录
		int last = 0;
		for (int i = 0; i < length; i++) {
			int t = (int) Math.pow(10, i);
			temp = num / t;
			last = temp % 10;
			sum = (int) (sum + Math.pow(last, length));
		}
		return sum == num;
	}

}

4.

bubuko.com,布布扣

说明:第一种方法的思路是用数组来模拟一个环形,但是最大的难度是数字的复制,即淘汰数字后将剩下的数字任然组成一个环形。

       第二种方式是直接用循环链表,但是最大的难度是按照题目的格式化输出结果

代码:

第一种方式:

package cn.wwh.www.exercise.selectmonkey;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 类的作用:5.猴子选大王
 *     这种做法有漏洞,并未完善(是个错误的,请勿参考)
 *     本人认为这种思路是对的,只不过有些处理分支有些问题,在此写下,以后有时间再转头仔细研究下
 *
 * @author 一叶扁舟
 * @version 1.0
 * @创建时间: 2014年9月5日 上午12:32:15
 */
public class SelectKing1 {

	public static void main(String[] args) {
		while (true) {
			System.out.print("请输入猴子的个数m:");
			Scanner scn = new Scanner(System.in);
			int total = scn.nextInt();
			scn = new Scanner(System.in);
			System.out.print("请输入淘汰的数字n(n<m):");
			int outNum = scn.nextInt();

			int king = getKing(total, outNum);
			System.out.println("第" + king + "只猴子为猴王!");

		}
	}

	/**
	 * @param total
	 *            猴子的总数
	 * @param outNum
	 *            要淘汰的数字
	 * @return 猴王的编号
	 */
	private static int getKing(int total, int outNum) {

		// 记录返回值的,king的编号
		int king = 0;
		int begin = total;
		int circle = 1;
		boolean flag = true;
		// 初始化数组,数组的长度为total+1,和一个临时数组
		int[] monkey = new int[total + 1];
		int[] temp = new int[total + 1];

		// 让数组中的数据和下标相等
		for (int i = 0; i < total + 1; i++) {
			monkey[i] = i;
		}

		while (flag) {

			// 还剩下一只猴子了
			if (total == 1) {
				king = monkey[1];
				break;
			}
			// 用于一个标志位,用于记录一个数组中最大N的倍数的位置
			int sign = 0;

			if (total != 1)
				System.out.print("第" + circle + "轮报数,");
			// 将这个n的倍数的数组位置置为0,并用sign记录最大的n的倍数下标
			for (int i = 1; i < total + 1; i++) {
				if (i % outNum == 0) {
					System.out.print("第" + monkey[i] + "只猴子因报" + i + "号 退出!");
					monkey[i] = 0;
					sign = i;
				}
			}
			int num = 1;

			if (total > outNum) {
				// 将sing+1-total+1位置
				for (int i = sign + 1; i < total + 1; i++) {
					// if(i >= total +1) break;
					if (monkey[i] != 0) {
						temp[num++] = monkey[i];
					}
				}

				// 1-sign非0位置的数据复制到temp数组中
				for (int i = 1; i < sign; i++) {
					if (monkey[i] != 0) {
						temp[num++] = monkey[i];
						// 剩下了num - 1只猴子了
					}
				}

				// 将temp数组中的数据复制到monkey数组中
				// 首先将monkey全部置为0
				for (int i = 1; i < total + 1; i++) {
					monkey[i] = 0;

				}
				monkey = Arrays.copyOfRange(temp, 0, num);

				if (num - 1 == 1 || num == 1) {
					king = monkey[1];
					flag = false;
				}

				System.out.println("当前退出" + (total + 1 - num) + "只猴子。");
				// 还剩下的猴子数量
				total = num - 1;
				// 报的圈数(轮数)
				circle++;
				if (total == outNum) {
					System.out.print("第" + circle + "轮报数,");
					System.out.print("第" + monkey[outNum] + "只猴子因报" + outNum
							+ "号 退出!");
					System.out.println("当前退出1只猴子。");
					monkey[outNum] = 0;
					total = total - 1;
					circle++;
					continue;
				}

			} else {// 最大标志位小于淘汰数outNum

				while (true) {
					// int leftNum = total;

					int loop = 0;
					int tempNum = 0;

					for (int i = 1; i < begin * 2; i++) {
						tempNum = total * i - outNum;
						loop = i;
						if (tempNum > 0) {
							break;
						} else if (tempNum == 0) {
							loop++;
							break;
						}
					}

					num = 1;
					for (int i = 0; i < loop; i++) {
						for (int j = 1; j < total + 1; j++) {
							temp[num++] = monkey[j];
						}
					}
					if (tempNum == 0) {
						System.out.print("第" + ++circle + "轮报数,");
					}

					System.out.print("第" + temp[outNum] + "只猴子因报" + outNum
							+ "号 退出!");
					System.out.println("当前退出1只猴子。");
					temp[outNum] = 0;
					// System.out.println(Arrays.toString(temp));

					// 首先将monkey全部置为0
					for (int i = 1; i < total + 1; i++) {
						monkey[i] = 0;

					}
					if (tempNum == 0) {
						// System.out.println("num:"+num);
						num = num - 1;
						monkey = Arrays.copyOfRange(temp, outNum, num);
					} else {
						monkey = Arrays.copyOfRange(temp, outNum, num);
					}

					System.out.println("num -1 -outNum:" + (num - 1 - outNum));
					System.out.println("total" + total);
					int m = monkey.length;
					System.err.println(m);
					if (total - 1 != 1 && total - 1 != num - 1 - outNum) {
						for (int i = 1; i < temp.length; i++) {
							monkey[m++] = temp[i];
							System.out.println(Arrays.toString(monkey));
							if (temp[i] == temp[outNum]) {
								break;
							}
						}
					}

					total = total - 1;
					// 还剩下一只猴子了
					if (total == 1) {
						king = monkey[1];
						break;
					}

				}

			}

		}

		return king;
	}

}


第二中方式:


package cn.wwh.www.exercise.selectmonkey;

/**
 * 类的作用:一个猴子实体类
 *
 *
 * @author 一叶扁舟
 * @version 1.0
 * @创建时间: 2014年9月5日 下午10:43:15
 */
public class Monkey {
	// 猴子的编号
	public int no;
	// 当前的猴子的下一个猴子
	public Monkey nextMonkey = null;

	public Monkey(int no) {
		this.no = no;
	}

}

package cn.wwh.www.exercise.selectmonkey;

/**
 * 类的作用:构建一个猴子环形圈
 *
 *
 * @author 一叶扁舟
 * @version 1.0
 * @创建时间: 2014年9月5日 下午10:46:46
 */

public class CycleLinked {

	// 环形圈中猴子的个数
	private int num;
	// 第一个猴子,即编号为1
	private Monkey firstMonkey = null;

	private Monkey tempMonkey = null;

	// 创建一个数量为num的猴子圈
	public CycleLinked(int num) {
		this.num = num;
		for (int i = 0; i < num; i++) {
			// 如果是第一个猴子
			if (i == 0) {
				// 创建一个猴子
				Monkey monkey = new Monkey(i + 1);
				// 指向第一猴子
				this.firstMonkey = monkey;
				this.tempMonkey = monkey;

			} else if (i == num - 1) {// 最后一个猴子
				// 创建一个猴子
				Monkey monkey = new Monkey(i + 1);
				this.tempMonkey.nextMonkey = monkey;
				this.tempMonkey = monkey;
				// 最后一个猴子指向第一个猴子
				this.tempMonkey.nextMonkey = this.firstMonkey;

			} else {
				// 创建一个猴子
				Monkey monkey = new Monkey(i + 1);
				this.tempMonkey.nextMonkey = monkey;
				this.tempMonkey = monkey;

			}
		}

	}

	/**
	 * @param outNum 要淘汰的数字编号
	 *            
	 */
	public void specak(int outNum) {

		// 剩下猴子的个数
		int last = this.num;
		// 记录一圈数过的数量
		int count = 0;
		// 记录轮数
		int circle = 1;
		Monkey first = this.firstMonkey;
		Monkey pre = first;
		Monkey delete;
		Monkey prePre = first;

		System.out.print("第" + circle + "轮报数,");

		while (last != 1) {

			// 数n-1下,找到要淘汰的猴子的前一个
			for (int i = 1; i < outNum - 1; i++) {
				while (prePre.nextMonkey.no != pre.no) {
					prePre = prePre.nextMonkey;
					if (prePre.nextMonkey.no == pre.no)
						break;
				}
				// System.out.println("pre.nextMonkey.no "+pre.nextMonkey.no );
				// System.out.println("pre.no"+pre.no);
				// System.out.println("prePre.no"+prePre.no);
				if ((pre.nextMonkey.no > pre.no && count != 0 && pre.no < prePre.no)
						|| (pre.nextMonkey.no < pre.no && count != 0 && pre.no > prePre.no)) {
					System.out.println("当前退出" + count + "只");
					// 以一圈为循环单位,下一个猴子报数大于当前猴子的报数
					circle++;
					System.out.print("第" + circle + "轮报数,");
					count = 0;
				}
				// current = pre.nextMonkey;
				pre = pre.nextMonkey;
				// current = current.nextMonkey;
				while (prePre.nextMonkey.no != pre.no) {
					prePre = prePre.nextMonkey;
					if (prePre.nextMonkey.no == pre.no)
						break;
				}
				// System.out.println("pre.nextMonkey.no "+pre.nextMonkey.no );
				// System.out.println("pre.no"+pre.no);
				// System.out.println("prePre.no"+prePre.no);
				if ((pre.nextMonkey.no > pre.no && count != 0 && pre.no < prePre.no)
						|| (pre.nextMonkey.no < pre.no && count != 0 && pre.no > prePre.no)) {
					System.out.println("当前退出" + count + "只");
					// 以一圈为循环单位,下一个猴子报数大于当前猴子的报数
					circle++;
					System.out.print("第" + circle + "轮报数,");
					count = 0;
				}
			}

			// 删除下一个结点
			delete = pre.nextMonkey;

			pre.nextMonkey = delete.nextMonkey;
			pre = pre.nextMonkey;
			System.out.print("第" + delete.no + "只猴子因报" + outNum + "号 退出!");
			count++;
			while (prePre.nextMonkey.no != pre.no) {
				prePre = prePre.nextMonkey;
				if (prePre.nextMonkey.no == pre.no)
					break;
			}
			// System.out.println("pre.nextMonkey.no "+pre.nextMonkey.no );
			// System.out.println("pre.no"+pre.no);
			// System.out.println("prePre.no"+prePre.no);
			if ((pre.nextMonkey.no > pre.no && count != 0 && pre.no < prePre.no)
					|| (pre.nextMonkey.no < pre.no && count != 0 && pre.no > prePre.no)) {
				System.out.println("当前退出" + count + "只");
				// 以一圈为循环单位,下一个猴子报数大于当前猴子的报数
				circle++;
				System.out.print("第" + circle + "轮报数,");
				count = 0;
			}

			last--;
			if (last == 1) {
				System.out.println("当前退出" + count + "只。");
			}

		}
		System.out.println("第" + pre.no + "只猴子为猴王!");

	}

	public static void main(String[] args) {
		// CycleLinked test = new CycleLinked(7);
		// test.specak(3);
		// Monkey first = test.getFirstMonkey();
		// Monkey temp = first;

		//测试猴子圈是否创建正确
		// do{
		// System.out.println("猴子报数:" + temp.no);
		// temp = temp.nextMonkey;
		// }while (temp != first);

	}

}


package cn.wwh.www.exercise.selectmonkey;

import java.util.Scanner;

/**
 *类的作用:2.采用循环链表的方式处理猴子选王的题目
 *最大的难度就是格式化输出结果(这个是分析+不断的测试的结果)
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014年9月5日   下午10:42:38
 */
public class SelectKing2 {

	public static void main(String[] args) {

		while (true) {
			System.out.print("请输入猴子的个数m:");
			Scanner scn = new Scanner(System.in);
			int total = scn.nextInt();
			scn = new Scanner(System.in);
			System.out.print("请输入淘汰的数字n(n<m):");
			int outNum = scn.nextInt();

			// 创建一个total长度的猴子圈
			CycleLinked test = new CycleLinked(total);
			// 淘汰猴子,
			test.specak(outNum);

		}
	}

}



J2SE习题(1)

标签:乘法口决表   水仙花数   求质数   猴子选大王   

原文地址:http://blog.csdn.net/u011662320/article/details/39096929

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!