Java编程练习题 | 自顶向下设计、自底向上实现模式的实践


1. 将整数的各位数字相加

编写一个方法,获取一个整数各位数字之和;

问题解决:

将整数所有位置的数相加
获取整数的长度
获取整数某个位置的数字
package demo;

import java.util.Scanner;
public class Test {
	public static int getIntLength(int number) {
		int i = 1,
			result = 0;
		while(true) {
			if (number < i) {
				return result;
			} else {
				i *= 10;
				result += 1;
			}
		} 
	} 
	public static int getNumberWithIndex(int number,int index) {
		number /= (int)Math.pow(10,index-1);
		return number % 10;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.print("请输入一个整数:");
		Scanner input = new Scanner(System.in);
		int number = input.nextInt(),
			length = getIntLength(number),
			result = 0;
		for (int i = 1; i <= length; i++) {
			result += getNumberWithIndex(number,i);
		}
		System.out.println(result);
	}
}

测试结果:

请输入一个整数:1234567890
45

2. 判断回文数

如果一个数字的逆序和它自身相等,则该数称为回文数;

判断回文数
获取该数的逆序数
获取该数的长度
获取该数特定数位上的数
package demo;

import java.util.Scanner;
public class Test {
	public static int getIntLength(int number) {
		int i = 1,
			result = 0;
		while(true) {
			if (number < i) {
				return result;
			} else {
				i *= 10;
				result += 1;
			}
		} 
	} 
	public static int getNumberWithIndex(int number,int index) {
		number /= (int)Math.pow(10,index-1);
		return number % 10;
	}
	public static int getReversedOrderNumber(int number) {
		int length = getIntLength(number),
			result = 0;
		for (int i = 1; i <= length; i++) {
			result += getNumberWithIndex(number,i) * (int)Math.pow(10, length-i);
		}
		return result;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.print("请输入一个整数:");
		Scanner input = new Scanner(System.in);
		int number = input.nextInt();
		if (number == getReversedOrderNumber(number)) {
			System.out.println("是");
		} else {
			System.out.println("否");
		}
	}
}

测试结果:

请输入一个整数:39493

3. 反序显示整数

获取该数的逆序数
获取该数的长度
获取该数特定数位上的数
package demo;

import java.util.Scanner;
public class Test {
	public static int getIntLength(int number) {
		int i = 1,
			result = 0;
		while(true) {
			if (number < i) {
				return result;
			} else {
				i *= 10;
				result += 1;
			}
		} 
	} 
	public static int getNumberWithIndex(int number,int index) {
		number /= (int)Math.pow(10,index-1);
		return number % 10;
	}
	public static int getReversedOrderNumber(int number) {
		int length = getIntLength(number),
			result = 0;
		for (int i = 1; i <= length; i++) {
			result += getNumberWithIndex(number,i) * (int)Math.pow(10, length-i);
		}
		return result;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.print("请输入一个整数:");
		Scanner input = new Scanner(System.in);
		int number = input.nextInt();
		System.out.println(getReversedOrderNumber(number));
	}
}

以上三个练习题充分展示了模块化编程重用性优良的特点。


4. 检测有效字符串

假设密码规则如下:

  1. 密码必须至少八位字符;
  2. 密码必须仅能包含字母和数字;
  3. 密码必须至少包含两个数字;

编写程序,检验字符串是否为有效的密码字符串;

package demo;

import java.util.Scanner;
public class Test {
	public static int getLengthOfPassword(String password) {
		return password.length();
	}
	public static boolean isDigitAndLetter(String password) {
		boolean hasOtherChar = false;
		for (int i = 0; i < password.length(); i++) {
			char digit = password.charAt(i);
			if ('0' > digit || digit > '9') {
				if (('a' > digit || digit > 'z') && 
					('A' > digit || digit > 'Z')) {
					hasOtherChar = true;
					break;
				}
			}
		}
		return !hasOtherChar;
	}
	public static int getNumberOfDigit(String password) {
		int numOfDigit = 0;
		for (int i = 0; i < password.length(); i++) {
			char digit = password.charAt(i);
			if ('0' <= digit && digit <= '9' ) {
				numOfDigit += 1;
			}
		}
		return numOfDigit;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		System.out.print("请输入密码:");
		String password = input.nextLine();
		if ((getLengthOfPassword(password) >= 8) && 
			(getNumberOfDigit(password) >= 2) &&
			(isDigitAndLetter(password))) {
			System.out.println("密码有效");
		} else {
			System.out.println("密码无效");
		}
	}
}

5. 梅森素数

如果一个素数可以写成2p-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数;编写程序,找出所有p小于等于31的梅森素数;

寻找梅森素数
计算2^p-1的结果
判断一个数是否为素数
package demo;

import java.util.Scanner;
public class Test {
	public static long getCalculateResult(long number) {
		long num = (long) number;
		return (long) (Math.pow(2,num) - 1);
	}
	public static boolean isPrime(long number) {
		boolean result = true;
		for (long i = 2; i <= number / 2; i++) {
			if (number % i == 0) {
				result = false;
				break;
			}
		}
		return result;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		for (long i = 2; i <= 31; i++) {
			long number = getCalculateResult(i);
			if (isPrime(number)) {
				System.out.println(i + " " + number);
			}
		}
	}
}

测试结果:

2 3
3 7
5 31
7 127
13 8191
17 131071
19 524287
31 2147483647

6. 双骰子赌博

有这样一种游戏,通过投掷两枚骰子进行:

  • 两枚骰子点数之和为2、3或者12,则失败;
  • 两枚骰子点数之和为7或者11,则获胜;
  • 当投掷出其它点数时,记录这个点数、继续投掷,直到投掷出7或者这个点数;前者失败,或者获胜;
通过循环与分支实现游戏规则
模拟两次投掷
模拟单次投掷
package demo;

import java.util.Scanner;
public class Test {
	public static int rollTheDie() {
		return (int)(1 + Math.random() * 6);
	}
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int resultOne = rollTheDie(),
			resultTwo = rollTheDie(),
			result = resultOne + resultTwo;
		System.out.println("您的投掷结果:" + 
				   resultOne + "+" + 
				   resultTwo + "=" + 
				   result);
		if (result == 2 ||
			result == 3 ||
			result == 12) {
			System.out.println("您失败了");
		} else if (result == 7 ||
				   result == 11) {
			System.out.println("您获胜了");
		} else {
			while(true) {
				int resultAnotherOne = rollTheDie(),
					resultAnotherTwo = rollTheDie(),
					resultAnother = resultAnotherOne + resultAnotherTwo;
				System.out.println("您的投掷结果:" + 
						   resultAnotherOne + "+" + 
						   resultAnotherTwo + "=" + 
						   resultAnother);
				if (resultAnother == 7) {
					System.out.println("您失败了");
					break;
				} 
				if (resultAnother == result) {
					System.out.println("您获胜了");
					break;
				}
			}
		}
	}
}

测试结果:

您的投掷结果:4+6=10
您的投掷结果:1+2=3
您的投掷结果:3+5=8
您的投掷结果:2+6=8
您的投掷结果:6+1=7
您失败了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值