第四章习题

本文探讨了一道与数字拆分及求和相关的编程题目,要求用户输入数字并计算其反序,判断是否为素数和回文。接着,详细介绍了汉诺塔问题的解决步骤,展示了解决3个和64个盘子情况的转移过程,为理解递归和算法提供了实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面我们来看一下函数这些题;

↓↓↓↓↓↓↓

这道题就是把数字拆分了,然后求和;

import java.util.Scanner;
class Demo04_01{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入一个数字:");
        long num=scanner.nextLong();
        
        int sum=sumDigits(num);
        System.out.println(sum);
    }
    public static int sumDigits(long n){
        int sum=0;
        while(true){
            sum+=n%10;
            n/=10;
            if(n==0){
                return sum;
            }
        }
    }
}

 

 

 

我们来分析一下这道题:

1.提示用户输入一个数字

2.先计算该数字的反序
3.对比反序的数字和数字本身

4.输出

import java.util.Scanner;
class Demo04_02{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num=scanner.nextInt();
        //判断该数字是否是一个回文
        if(isPalindrome(num)){  // pause1
            System.out.println("是回文");
        }else{
            System.out.println("不是回文");
        }
        //return ;
    }
    public static boolean isPalindrome(int num){
        return reverse(num)==num; 
    }
    public static int reverse(int num){
        int sum=0;
        while(true){
            sum=sum*10+num%10;
            num/=10;
            if(num==0){
                return sum;
            }
        }
    }
}

输入几个例子,看结果:

请输入一个数字:121
是回文

C:\Users\ASUS\Desktop\xxl.code>java Demo04_02
请输入一个数字:234
不是回文

 

 

提示用户输入一个数字;

根据公式计算

输出,

import java.util.Scanner;
class Demo04_05{
    public static void main(String[] args){
        System.out.print("请输入一个数字:");
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();    
        System.out.println(sqrt(n));
    }
    public static double sqrt(long n){
        double lastGuess=1;
        double nextGuess=(lastGuess+n/lastGuess)/2;
        while(true){
            if(Math.abs(nextGuess-lastGuess)<0.00001){
                return nextGuess;
            }
            lastGuess=nextGuess;
            nextGuess=(lastGuess+n/lastGuess)/2;
        }
    }
}

 

输入几个值去验证一下;

C:\Users\ASUS\Desktop\xxl.code>java Demo04_05
请输入一个数字:27
5.196152422706632

C:\Users\ASUS\Desktop\xxl.code>java Demo04_05
请输入一个数字:9
3.0

 

   1.本身是素数
   2.反转之后也是素数
   3.不能是回文

用三个函数来实现:

素数()  反转() 回文功能()

     下面是代码段:

class Demo04_07{
    public static void main(String[] args){
        int count=0;
        int num=2;
        while(true){
            if(isFanZhuanSuShu(num)){
                count++;
                System.out.print(num+" ");
                if(count%10==0){
                    System.out.println();
                }
            }
            if(count==100){
                return; //结束当前函数
            }
            num++;
        }
    }
    public static boolean isFanZhuanSuShu(int num){
        return isSuShu(num)&&isSuShu(reverse(num))&&!isHuiWen(num);
    }
    //回文功能
    public static boolean isHuiWen(int num){
        return reverse(num)==num;
    }
    //素数功能
    public static boolean isSuShu(int num){
        for(int i=2;i<=num/2;i++){
            if(num%i==0){
                return false;
            }
        }
        return true;
    }
    //反转功能
    public static int reverse(int num){
        int sum=0;
        while(true){
            sum=sum*10+num%10;
            num/=10;
            if(num==0){
                return sum;
            }
        }
    }
}

 

看结果:

C:\Users\ASUS\Desktop\xxl.code>java Demo04_07
13 17 31 37 71 73 79 97 107 113
149 157 167 179 199 311 337 347 359 389
701 709 733 739 743 751 761 769 907 937
941 953 967 971 983 991 1009 1021 1031 1033
1061 1069 1091 1097 1103 1109 1151 1153 1181 1193
1201 1213 1217 1223 1229 1231 1237 1249 1259 1279
1283 1301 1321 1381 1399 1409 1429 1439 1453 1471
1487 1499 1511 1523 1559 1583 1597 1601 1619 1657
1669 1723 1733 1741 1753 1789 1811 1831 1847 1867
1879 1901 1913 1933 1949 1979 3011 3019 3023 3049

 

 

 

import java.util.*;
class Demo04_09{
    public static void main(String[] args) throws Exception{
        Scanner in = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String s = in.nextLine();
        if(s==null || s.trim().length()==0){
            System.out.println("你输入的字符串无意义!");
            return;
            }
            for(int i=s.length()-1; i>=0; i--){
            System.out.print(s.charAt(i));
        }
   }    
}

 

输入几个值看结果:

请输入一个字符串:123
321
C:\Users\ASUS\Desktop\xxl.code>java Demo04_09
请输入一个字符串:
你输入的字符串无意义!

 

 

import java.util.Scanner;
 class Demo04_10{
	public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = sc.next();
        char[] arr = str.toCharArray();
        int sum = 0;//统计多少个大写字母
        String result = ""; //连接大写字母
        for(int i = 0; i < arr.length; i++){
            if((int)arr[i] >= 65 && (int)arr[i] <= 90){
                sum = ++sum;
                result += arr[i];
            }
        }
        System.out.println("大写字母一共:" + sum+"---");
        System.out.println("分别为:" + result);
    }
    }
}


 

输入值看结果:

Welcome to java
大写字母一共:1---
分别为:W

 

→─↓→汉诺塔问题:

 

 

最大的问题将X上的三个盘子放到Z上
3个 X->Z
    前2个 X->Y
        前1个 X->Z
        第2个 X->Y
        前1个 Z->Y
    第3个 X->Z
    前2个 Y->Z
        前1个 Y->X
        第2个 Y->Z
        前1个 X->Z
64个 X->Z
    前63个 X->Y
        前62个 X->Z

        第63个 X->Y
        前62个 Z->Y
    第64个 X->Z
    前63个 Y->Z
        前62个 Y->X
        第63个 Y->Z
        前62个 X->Z

 

 

class Hanno{
    public static void main(String[] args){
        //盘子的个数 出发 中间 目的
        hanno(64,"X","Y","Z");
    }                                     
    public static void hanno(int n,String begin,String mid,String end){
        if(n==1){
            System.out.println(begin+" -> "+end);
        }else{
            hanno(n-1,begin,end,mid);
            System.out.println(begin+" -> "+end);
            hanno(n-1,mid,begin,end);
        }
    }
}

 

当是三个盘子的时候,结果如下:

C:\Users\ASUS\Desktop\xxl.code>java Hanno
X -> Z
X -> Y
Z -> Y
X -> Z
Y -> X
Y -> Z
X -> Z

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值