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. 检测有效字符串
假设密码规则如下:
- 密码必须至少八位字符;
- 密码必须仅能包含字母和数字;
- 密码必须至少包含两个数字;
编写程序,检验字符串是否为有效的密码字符串;
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的梅森素数;
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
您失败了