java 第一天

本文档包含一系列Java编程基础练习题目,如求最大最小值、水仙花数、阶乘求和、逆序数字、位运算、火车运行时间和数字陷阱等。每个题目提供输入输出格式、样例及解题思路,适合初学者巩固基础。

总述:

输出时,连接a&c等样式时,需要用括号括起来构成整体,
字符串输入,char b=input.next().charAt(0);
java输入范式:必须输入头文件 import java.util.Scanner;
调用时,先输入Scanner input=new Scanner(System.in)
通过使用System流来进行输入,同时使用Scanner进行定义input输入类型。
接下来进行整数或字符输入分别输入:
int a=input.nextInt();
char b=input.next().charAt(0);

7-1 一批数中最大值最小值

从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时循环结束。。

输入格式:

在一行中输入若干个用空格间隔的整数(不要超过15个数),最后输入负数结束输入,数据之间只能用1个空格间隔。

输出格式:

在一行中按照“max=最高分,min=最低分”的格式输出结果,最高分和最低分均原样输出,没有列宽控制。

输入样例:

58 78 95 65 86 -1

输出样例:

max=95,min=58

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 M

思路:首先先把最大最小赋值为0,每输入一个数,与最大值相比,如果比最大值大,把它赋值给最大数。如果最小数为0,把他赋值给最小值。如果不为0,如果一个数小于最小值,把他赋值给最小值。最后输出

import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        int max=0,min=0;
        while(true){
            int a=input.nextInt();
            if(a<0)break;
            if(min==0)min=a;
            else{
                if(max<a)max=a;
                if(min>a)min=a;
            }


        }
        System.out.println("max="+max+","+"min="+min);
    }
}

注意:输入要加 import java.util.Scanner;

Scanner input=new Scanner (System.in);        

int a=input.nextInt();

7-2 找出三位水仙花数

本题要求编写程序,输出给定正整数M和N区间内的所有三位水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。

输入格式:

输入在一行中给出两个正整数M和N(100≤M≤N≤999)。

输出格式:

顺序输出M和N区间内所有三位水仙花数,每一行输出一个数。若该区间内没有三位水仙花数,则无输出。

如果M或者N不符合题目的要求,则输出Invalid Value.

输入样例1:

100 400

输出样例1:

153
370
371

思路分析:水仙花数,重点是数位分离求和,各项分离三次方求和,判断与原来书是否相等

代码实现:

import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        int a=input.nextInt();
        int e=input.nextInt();
        if(100<=a&&a<=e&&e<=999){
            for(int i=a;i<=e;i++){

                int b,c,d;
                b=i%10;
                c=i/10%10;
                d=i/100;
                if(b*b*b+c*c*c+d*d*d==i){
                    System.out.println(i);
                }

            }



        }
        else{
            System.out.println("Invalid Value.");
        }

    }
}

7-3 求1!+2!+……+n!

求1!+2!+3!+……+n!,n<12,要求用一重循环设计程序。

输入格式:

输入一个小于12的正整数。

输出格式:

在一行中以“m=运算结果”顺序输出,其中运算结果是一个正整数,没有任何列宽控制。

输入样例:

5

输出样例:

m=153

思路分析:

通过循环使得一个数的阶乘得以实现,定义一个1的变量,乘等于i(这个数不断减一直到大于0),要实现各项相加,还得定义一个sum,放在各自阶乘外面,从而实现目标。

代码实现: 

import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        int a=input.nextInt();
        int sum=0;
        for(int i=a;i>0;i--){
            int c=1;
            for(int j=i;j>0;j--){
                c*=j;
            }
            sum+=c;
        }
        System.out.println("m="+sum);
    }
}

注意:

如果·采用for(int i=0;i<a;i++){while(i>0){c*=i;i--}}由于内外循环i一致,所以做完一次i为0,满足了外层循环结束条件,结束了循环,无法达到阶乘之和之效果。

7-4 逆序的三位数

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出按位逆序的数。

输入样例:

123

输出样例:

321

思路分析: 

数位分离,由于限制三位数,因此把分离出来的个十百分别乘以100.10.1实现数位的逆序,注意:先乘以相应权重再加。从而实现书的逆序。

代码实现:

import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        int a=input.nextInt();
        int sum=0;
        int b,c,d;
        b=a%10;//个位
        c=a/10%10;//十
        d=a/100;//百
        int g=b*100+c*10+d;


        System.out.println(g);
    }
}

 

7-5 Java中二进制位运算

本题目要求读入2个整数和一个字符,然后根据这个字符值,对两个整数进行相应的二进制位的运算。要求必须使用switch选择结构

(1)如果字符是&,则两个整数进行二进制位的与运算

(2)如果字符是 |,则两个整数进行二进制位的或运算

(3)如果字符是^,则两个整数进行二进制位异或运算

(4)如果是其他字符,则固定输出信息:ERROR

输入格式:

在一行中依次输入整数1,字符,整数2。

输出格式:

类似3 & 4 = 0

其中,运算符号&的前后都有一个空格,等号的前后也都有一个空格。
上面表示3和4做二进制的与运算,结果是0。

输入样例:

3的二进制是0011,4的二进制是0100,二者与运算的结果是0。

3 & 4

输出样例:

注意&和=的前后,都是有且仅有一个空格。

3 & 4 = 0

输入样例:

7 X 3

输出样例:

ERROR

思路分析:

先判断是不是 "&""|""^",是的话就做相应位运算,位运算直接打即可,不要想太复杂。

不是输出ERROR,采用''较为更合适。

代码实现:

import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        int a=input.nextInt();
        char b=input.next().charAt(0);
        int c=input.nextInt();
        switch(b){
            case '&':System.out.println(a+" "+'&'+" "+c+" "+"="+" "+(a&c));break;
            case '|':System.out.println(a+" "+'|'+" "+c+" "+"="+" "+(a|c));break;
            case '^':System.out.println(a+" "+'^'+" "+c+" "+"="+" "+(a^c));break;
            default:  System.out.println("ERROR");
        }



    }
}
/*注意:输出时,连接a&c等样式时,需要用括号括起来构成整体,
字符串输入,char b=input.next().charAt(0);
java输入范式:必须输入头文件 import java.util.Scanner;
调用时,先输入Scanner input=new Scanner(System.in)
通过使用System流来进行输入,同时使用Scanner进行定义input输入类型。
接下来进行整数或字符输入分别输入:
int a=input.nextInt();
char b=input.next().charAt(0);*/

7-6 计算火车运行时间

本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

输入格式:

输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。

输出格式:

在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。

输入样例:

1201 1530

输出样例:

03:29

思路分析:

本题两个点,就是时间是60一小时,而在十位制里,一个是差100,因此难度在于差的40里,其他的话直接减去,输出即可。由于本题涉及时间的输出,因此采用C语言printf较为方便快捷。

本题关键就在于时间之间差值与百位之间差值不同,相差40,
因此判断需不需要进行减去40主要看A的百十位与B的百十位哪个大,
如果B大直接减输出C/100前两位,C%100后两位。如果A大,前两位不变,后两位输出再减去40后的结果即可。

代码实现: 

 

 

import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        int a=input.nextInt();
        int b=input.nextInt();
        int c=b-a;
        if((a%100)>(b%100))System.out.printf("%02d:%02d",c/100,c%100-40);
        else System.out.printf("%02d:%02d",c/100,c%100);


    }
}
/**/本题关键就在于时间之间差值与百位之间差值不同,相差40,
        因此判断需不需要进行减去40主要看A的百十位与B的百十位哪个大,
        如果B大直接减输出C/100前两位,C%100后两位。如果A大,前两位不变,后两位输出再减去40后的结果即可。

 

7-7 掉入陷阱的数字

对任意一个自然数N0​,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N1​;然后对N1​重复这种操作,可以产生新自然数N2​;……多次重复这种操作,运算结果最终会得到一个固定不变的数Nk​,就像掉入一个数字“陷阱”。

本题要求对输入的自然数,给出其掉入“陷阱”的过程。

输入格式:

在一行内给出一个自然数N0​(N0​<30000)。

输出格式:

对于输入的N0​,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:Ni​ (i≥1)。当某一步得到的自然数结果Nk​(k≥1)与上一步Nk−1​相同时,停止输出。

输入样例:

5

输出样例:

1:16
2:22
3:13
4:13

思路分析:

数位分离,乘3+1.。得出来结果和上次结果相同即结束。

主要问题在于a作为数位分离的对象,他在分离完之后无法满足条件,而是要把算出的SUM进行分离,因此左后要把sum赋值给a,同时在前面要借助一个临时变量存放前一个的SUM值,在新SUM算出来后进行if比较,如果相同就System.out.println,加break;不同也要System.out.println。

import java.util.Scanner;
public class Main{
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        int a=input.nextInt();
        int cnt=0;//定义计数器表示次数
        while(true){
            cnt++;
            int sum=0;
            int d=a;
            while(a>0){
                sum+=a%10;//各项乘3
                a/=10;
            }
            sum=sum*3+1;//之和加1
            if(d==sum){
                System.out.println(cnt+":"+sum);//先输出,让读者觉得两个相同不继续了
                break;
            }
            System.out.println(cnt+":"+sum);//先输出,让读者觉得两个相同不继续了
            a=sum;//把上一个sum保存至b和i中,使得i满足循环条件接着做while循环。

        }



    }
}
//通过最后a=sum,实现满足永真循环条件,再在前面定义d=a,根据后面算出的sum比较来进行中断或是持续。

总结:

JAVA初学者在于回顾C的思维同时掌握JAVA的输入语句:

import java.util.Scanner;

Scanner input=new Scanner(System.in);

int a=input.nextInt();

char c=input.next().charAt(0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值