下面附带一些第六章习题
- 定义方法的语法如下所示:
修饰符 返回值类型 方法名( 参数列表 ) {
// 方法体;
}
- 函数重载
重载函数是函数的一种特殊情况,为方便使用,Java允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。
- 函数递归
函数自己调用自己chen称为递归
递归的三要素:
- 一定有一种可以退出程序的情况;
- 总是在尝试将一个问题化简到更小的规模
- 父问题与子问题不能有重叠的部分
6.2 (求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:
public static int sumDigits(long n) 例如:sumDigits(234)返回 9(2+3+4).
import java.util.*;
class Class25{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字:");
long n = scanner.nextLong();
System.out.println(sumDigits(n));
}
public static int sumDigits(long n){ //设置计算函数
int sum = 0;
while(n != 0){
long num = n%10;
sum += num;
n /= 10;
}
return sum;
}
}
此题的输入的数字利用对10取余和除以10来进行简单计算的。
6.3 ( 回文数字)如果一个数字的反向倒置数和它的顺向数一样,这个数就称作回文数。编写一个测试程序,提示用户输人一个整数值,然后报告这个整数是否是回文数。
import java.util.*;
class Class26{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字:");
int n = scanner.nextInt();
if(isPalindrome(n)){
System.out.println("该数是一个回文数字");
}else{
System.out.println("该数不是一个回文数字");
}
}
public static int reverse(int number){ //这个函数是将输入进来的数字进行取反
int revNumber = 0;
while(number != 0){
revNumber = revNumber*10+number%10; //对输入的数字进行对10取余,取出个位数字,乘10是将个位数字向十位和百位转换
number /= 10;
}
return revNumber;
}
public static boolean isPalindrome(int number){ //判断该数字是否是回文数字
int revNumber = reverse(number);
if(revNumber == number){
return true;
}
return false;
}
}
此题,和6.2题使用的方法一样,将进来的数字进行,对10取余取出个位数字,然将乘10往更高位上面转换,最后进行判断。
6.18 (检测密码)一些网站对于密码具有一些规则。编写一个方法,检测字符串是否是一个有效密码。 假定密码规则如下: • 密码必须至少 8 位字符。 • 密码仅能包含字母和数字。 • 密码必须包含至少两个数字。 编写一个程序,提示用户输入一个密码,如果符合规则,则显示 Valid Password, 否则 显示 Invalid Password
import java.util.*;
class Class27{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你要注册的密码:");
String pwd = scanner.nextLine();
pwd(pwd);
}
public static void pwd(String pwd){
int numCount = 0;
if(pwd.equals("")){ //判断输入的密码是否为空
System.out.println("密码不能为空");
return;
}else if(pwd.length()<7){ //判断长度
System.out.println("密码长度至少8位");
return;
}
for(int i=0;i<pwd.length();i++){
if(pwd.charAt(i)<48||(pwd.charAt(i)>57 && pwd.charAt(i)<65)||(pwd.charAt(i)>90 && pwd.charAt(i)<97)||pwd.charAt(i)>122){ //判断输入的密码是否是正确的输入
System.out.println("密码必须是包含数字和字母");
return;
}else if(pwd.charAt(i)>=48 && pwd.charAt(i)<=57){
numCount++;
}
}
if(numCount<2){
System.out.println("密码至少有两个数字");
return;
}
System.out.println("Valid Passwoed");
}
}
本题比较麻的地方在如何判断密码在正确范围里面,所以我们先要判断它的长度,然后再是密码的范围,密码的范围可以通过ASCⅡ表来判断。
6.26 (回文素数)回文素数是指一个数同时为素数和回文数。
import java.util.*;
class Home26{
public static void main(String[] args){
if(isHuiWenSuShu(InitData())){
System.out.println("该数是回文素数");
}else{
System.out.println("不是回文素数");
}
}
public static int InitData(){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字:");
return scanner.nextInt();
}
public static boolean isHuiWenSuShu(int num){
return isHuiWen(num)&&isSuShu(num);
}
public static boolean isHuiWen(int num){
if(reverse(num)==num){
return true;
}
return false;
}
public static int reverse(int num){
int revNum = 0;
while(num!=0){
revNum = revNum*10+num%10;
num /= 10;
}
return revNum;
}
public static boolean isSuShu(int num){
boolean flag=true;
for(int i=2;i<=num/2;i++){
if(num%2==0){
flag = false;
break;
}
}
return flag;
}
}
本题的思路是将输入进来的数字先进行反转,然后判断是否是回文数字,判断回文数字和上述的题目一样;如果是,进行下一步判断,是否是素数,可以通过对2取余,如果是零说明不是素数,否则是,然后结合之前判断的回文数字,两者结合得出结论。
6.30 掷双骰子游戏是赌场中非常流行的骰子游戏,编写对应的程序
import java.util.*;
class Home27{
public static void main(String[] args){
Add();
}
public static void Add(){
Random random = new Random();
int crapsA = random.nextInt(6)+1;
int crapsB = random.nextInt(6)+1;
int add = crapsA+crapsB;
if((add>=4&&add<=6)||(add>=8&&add<=10)){
System.out.println("你掷出的是"+crapsA+"+"+crapsB+"="+add);
System.out.println("点数是"+add);
twoAdd(add); //如果在上述if的条件里面则执行第二次的掷骰子
}
if(add==2 || add==3 || add==12){ //如果是2,3和12,用户输
System.out.println("你掷出的是"+crapsA+"+"+crapsB+"="+add);
System.out.println("你输了");
}else if(add==7 || add==11){ //如果是7和11,用户赢
System.out.println("你掷出的是"+crapsA+"+"+crapsB+"="+add);
System.out.println("你赢了");
}
}
public static void twoAdd(int add){ //函数执行第二次投掷骰子
Random random = new Random();
int crapsA2 = random.nextInt(6)+1;
int crapsB2 = random.nextInt(6)+1;
int add2 = crapsA2+crapsB2;
if(add==add2){ //如果相加的和与上次相等,用户赢
System.out.println("你掷出的是"+crapsA2+"+"+crapsB2+"="+add2);
System.out.println("你赢了");
return;
}else if(add2==7){ //等于7时,用户输
System.out.println("你掷出的是"+crapsA2+"+"+crapsB2+"="+add2);
System.out.println("你输了");
return;
}
while(true){ //如果在上述范围外的话,则继续执行twoAdd函数,直到与上述判断相等
twoAdd(add);
break;
}
}
}
这道题比较复杂在第二次的投掷骰子上面,如果第二次投掷的数字之和与第一次之和相等,则用户赢,如果等于7,用户输,如果都没有在这两个条件里面的话,则继续执行twoAdd函数,也就是递归,直到遇到跳出的条件。