Java学习笔记(二)

对Java学科的考试进行一定的总结。

1.for循环和增强for循环遍历数组

增强for循环_手可摘☆辰的博客-CSDN博客https://blog.csdn.net/qq_48374573/article/details/117199933

public class Test {
    public static void main(String[] args) {
        int arr[]={1,3,5,7,9};
        int sum1=0;
        int sum2=0;
        //普通for循环
        for (int i = 0; i < arr.length; i++) {
            //累加求和
            sum1+=arr[i];
        }
        //增强型for循环
        for(int i:arr){
            //累加求和
            sum2+=i;
        }
        System.out.println("数组求和为:"+sum1);
        System.out.println("数组求和为:"+sum2);
    }
}

2.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

设小球的初始高度为h,当小球第1次落地时,共经过h米,反弹高度为h/2米

当小球第2次落地时,共经过(h+h/2+h/2)米,反弹高度为h/4米

当小球第3次落地时,共经过(h+h/2+h/2+h/4+h/4)米,反弹高度为h/8米依次类推就可以得到思路。

可以把小球第一次落地单独处理,然后就只需要循环(10-1)次,最后再额外反弹一次即可。

public class Test {
    public static void main(String[] args) {
        //类型肯定是浮点数,用整型直接就没了
        double bounce=100;//初始反弹高度
        double totalHeight=100;//第一次单独处理
        //题目问的是第10次落地时的情况
        for (int i = 2; i <= 10; i++) {
            bounce=bounce/2;//反弹高度减半
            totalHeight+=bounce*2;//一个往返
        }
        bounce/=2;//最后落地的时候还会反弹一次
        System.out.println("小球共经过"+totalHeight+"米");
        System.out.println("第10次反弹小球有"+bounce+"米");
    }
}

3.海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

这个题目假设原来有x个桃子,第一只猴子之后还剩下(x-1)*4/5个桃子,之后也是类似的思路,假设有个就是y=(x-1)*4/5,反解出x=5y/4+1,因为要保证每次都可以按照要求分配,也就是每次都需要是整除,这个时候求最后一次剩下多少桃子就可以求出海滩上原来最少有多少个桃子了。

public class Test {
    public static void main(String[] args) {
        int peach=4;//假设最后一次分配桃子的个数,根据公式x=5y/4+1,y每次需要时4的倍数
        while(true){
            int tmp=peach;//求桃子最开始的个数
            int count=1;//标记此时有几只猴子分配了
            //一共有五只猴子进行了分配,要保证每次都是可以按要求分配的
            for(int i=0;i<5;i++){
                //求上一次分配桃子的个数是否满足上上次分配的条件
                tmp=tmp*5/4+1;
                //满足要求
                if(tmp%4==0){
                    count++;
                }else{
                    //直接不合格了
                    break;
                }
            }
            //要经历四次
            if(count==5) {
                System.out.println("海滩上原来最少有" + tmp + "个桃子");
                break;
            }
            peach+=4;//每次是按4的倍数增长
        }
    }
}

4.锯齿数组的遍历

二维数组中的每一个元素都是一个一维数组,这样就好理解了一点了。

public class Test3 {
    public static void main(String[] args) {
        int [][]arr={{1,2,3,4,5},{1,2,3,4},{1,2,3},{1,2},{1}};
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }
}

5.判断101-200之间有多少个素数,并输出所有素数

这个还是比较经典的题目了,C语言也写过类似的题目。

求范围内的质数的个数_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130451290?spm=1001.2014.3001.5501

public class Test {
    public static void main(String[] args) {
        final int COUNT=10;//每行输出10个
        int count=0;//统计一共有多少个质数
        //首先确定区间范围[101,200]
        //因为偶数不可能是素数,所以就考虑奇数即可了
        for(int i=101;i<=200;i+=2){
            double tmp=Math.sqrt(i);
            boolean flag=true;//标记此时这个数是否是质数
            for(int j=2;j<=tmp;j++){
                if(i%j==0){
                    flag=false;
                    break;
                }
            }
            if(flag){
                count++;//累计质数的个数
                if(count%COUNT==0){//每10个换行输出
                    System.out.println(i);
                }else {
                    System.out.print(i+"\t");
                }
            }
        }
    }
}

6.打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。

public class Test {
    public static void main(String[] args) {
        //首先可以确定范围是[100,999]之间的
        for(int i=100;i<1000;i++){
            //按要求求另一个数(Math.pow返回值是double类型的,所以需要类型转化)
            int j= (int) (Math.pow(i%10,3)+Math.pow(i/10%10,3)+Math.pow(i/100,3));
            //相等就输出水仙花数
            if(i==j){
                System.out.println(i);
            }
        }
    }
}

相类似的可以求出独身数、四叶玫瑰数,五角星数,六合数,北斗七星数,八仙数,九九重阳数。

public class Test {
    public static void main(String[] args) {
        //(一位数)独身数
        int count=0;
        for(int i=0;i<10;i++){
            int j= (int) Math.pow(i%10,1);
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("独身数一共有"+count+"个");

        //二位数
        count=0;
        for(int i=10;i<100;i++){
            int j= (int) (Math.pow(i%10,2)+Math.pow(i/10,2));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("二位数一共有"+count+"个");

        //三位数(水仙花数)
        count=0;
        for(int i=100;i<1000;i++){
            int j= (int) (Math.pow(i%10,3)+Math.pow(i/10%10,3)+Math.pow(i/100,3));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("水仙花数一共有"+count+"个");

        //四位数(四叶玫瑰数)
        count=0;
        for(int i=1000;i<10000;i++){
            int j= (int) (Math.pow(i%10,4)+Math.pow(i/10%10,4)+Math.pow(i/100%10,4)+Math.pow(i/1000,4));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("四叶玫瑰数一共有"+count+"个");

        //五位数(五角星数)
        count=0;
        for(int i=10000;i<100000;i++){
            int j= (int) (Math.pow(i%10,5)+Math.pow(i/10%10,5)+Math.pow(i/100%10,5)+
                    Math.pow(i/1000%10,5)+Math.pow(i/10000,5));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("五角星数一共有"+count+"个");

        //六位数(六合数)
        count=0;
        for(int i=100000;i<1000000;i++){
            int j= (int) (Math.pow(i%10,6)+Math.pow(i/10%10,6)+Math.pow(i/100%10,6)+
                    Math.pow(i/1000%10,6)+Math.pow(i/10000%10,6)+Math.pow(i/100000,6));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("六合数一共有"+count+"个");

        //北斗七星数
        count=0;
        for(int i=1000000;i<10000000;i++){
            int j= (int) (Math.pow(i%10,7)+Math.pow(i/10%10,7)+Math.pow(i/100%10,7)+ Math.pow(i/1000%10,7)+
                    Math.pow(i/10000%10,7)+Math.pow(i/100000%10,7)+Math.pow(i/1000000,7));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("北斗七星数一共有"+count+"个");

        //八仙数
        count=0;
        for(int i=10000000;i<100000000;i++){
            int j= (int) (Math.pow(i%10,8)+Math.pow(i/10%10,8)+Math.pow(i/100%10,8)+ Math.pow(i/1000%10,8)+
                    Math.pow(i/10000%10,8)+Math.pow(i/100000%10,8)+Math.pow(i/1000000%10,8)+Math.pow(i/10000000,8));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("八仙数一共有"+count+"个");

        //九九重阳数
        count=0;
        for(int i=100000000;i<1000000000;i++){
            int j= (int) (Math.pow(i%10,9)+Math.pow(i/10%10,9)+Math.pow(i/100%10,9)+ Math.pow(i/1000%10,9)+
                    Math.pow(i/10000%10,9)+Math.pow(i/100000%10,9)+Math.pow(i/1000000%10,9)+
                    Math.pow(i/10000000%10,9)+Math.pow(i/100000000,9));
            if(i==j){
                count++;
                System.out.print(i+" ");
            }
        }
        System.out.println("九九重阳数一共有"+count+"个");
    }
}

能求是能求就是太慢了,九位就这样了,十位我就没写了。十全十美数:4679307774

Java学习笔记(二)_第1张图片

7. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

这个就是之前写过了,简化一下。Linux下C、C++、和Java程序设计_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130825487?spm=1001.2014.3001.5501

import java.util.Scanner;
//202140200126
public class Test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入您的学号:");
        long sno=sc.nextLong();
        System.out.print(sno+"=");
        while(!isPrime(sno)){
            if(sno%2==0){
                //输出2,除以2
                System.out.print(2+"*");
                sno/=2;
                continue;
            }
            double tmp=Math.sqrt(sno);
            for(long i=3;i<=tmp;i+=2){
                if(sno%i==0){
                    System.out.print(i+"*");
                    sno/=i;
                    break;
                }
            }
        }
        System.out.println(sno);
    }
    //判断sno是否是质数
    public static boolean isPrime(long sno){
        if(sno%2==0){
            return false;
        }
        double tmp=Math.sqrt(sno);
        //缩小范围
        for(long i=3;i<=tmp;i+=2){
            if(sno%i==0){
                return false;
            }
        }
        return true;
    }
}

8.输入两个正整数m和n,求其最大公约数和最小公倍数。

这个就是之前写过类似的题目了,虽然是用C语言写的。那这里就用辗转相除法求一下。求出最大公约数,最小公倍数就好求了。最小公倍数 = (两数之积) / 最大公因数

C语言复习题_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130682554?spm=1001.2014.3001.5501

import java.util.Scanner;

public class Test{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //得到两个正整数
        System.out.print("请输入第一个正整数:");
        int m=sc.nextInt();
        System.out.print("请输入第二个正整数:");
        int n=sc.nextInt();
        int mn=m*n;//保存两数之积
        while(n!=0){
            int tmp=m%n;
            m=n;
            n=tmp;
        }
        System.out.println("最大公约数是:"+m);
        //最小公倍数 = (两数之积) / 最大公因数
        System.out.println("最小公倍数是:"+mn/m);
    }
}

9.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

得到字符串,再逐个字符进行判断分情况统计即可了。

import java.util.Scanner;

//输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
public class Test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入一行字符:");
        //得到一行字符串
        String str=sc.nextLine();
        int englishLetters=0;//统计英文字母个数
        int blank=0;//统计空格字符个数
        int digit=0;//统计数字字符个数
        int other=0;//统计其他字符个数
        for (int i = 0; i < str.length(); i++) {
            char c=str.charAt(i);
            if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
                englishLetters++;
            }else if(c==' '){
                blank++;
            }else if(c>='0'&&c<='9'){
                digit++;
            }else{
                other++;
            }
        }
        System.out.printf("该字符串英文字母有%d个,空格字符有%d个,数字字符有%d个,其他字符有%d个",
                englishLetters,blank,digit,other);
    }
}

10.有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

范围是1到4,每一个位置的可能性都是1到4,根据组合,就是先4个选一个,然后3个选一个,最后是2个选一个,结果就是4*3*2=24,写程序的可以用循环吧所以的情况列出来,筛选出满足要求的数字即可。

public class Test {
    public static void main(String[] args) {
        int count=0;//统计一共有多少种的可能性
        int COUNT=10;
        //因为是三位数,先枚举所有的情况,再筛选出符合要求的
        for(int x=1;x<5;x++){
            for(int y=1;y<5;y++){
                for(int z=1;z<5;z++){
                    //保证无重复数字
                   if(x!=y && x!=z && y!=z){
                       //得到三位数
                       int res=x*100+y*10+z;
                       count++;
                       //每行输出10个
                       if(count%COUNT==0){
                           System.out.println(res);
                       }else {
                           System.out.print(res+" ");
                       }
                   }
                }
            }
        }
    }
}

11.输出九九乘法表

循环输出就行了。

public class Test {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for(int j=1;j<=i;j++){
                int res=i*j;
                System.out.printf("%d*%d=%d ",j,i,res);
            }
            //换行
            System.out.println();
        }
    }

12.某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

也可以转换成字符数据来运算,这里也是第一次用到setCharAt方法,就直接用Stringbuffer来写了。

import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入待加密的数据:");
        StringBuffer sb = new StringBuffer(sc.nextLine());
        if (sb.length() != 4) {
            System.out.println("数据长度不规范,加密失败");
            System.exit(0);
        }
        for (int i = 0; i < sb.length(); i++) {
            if (sb.charAt(i) >= '0' && sb.charAt(i) <= '9') {
                //int digit = sb.charAt(i) - '0';//转换成数字
                //digit = digit + 5;//每位数字都加上5
                //digit = digit % 10;//用除以10的余数代替改数字
                //sb.setCharAt(i, (char) (digit+'0'));//更新
                sb.setCharAt(i,(char)(((sb.charAt(i)-'0'+5)%10)+'0'));
            } else {
                System.out.println("数据输入不规范,无法进行加密运算");
                System.exit(0);
            }
        }
        //交换
        char tmp=sb.charAt(0);
        sb.setCharAt(0,sb.charAt(3));
        sb.setCharAt(3,tmp);
        tmp=sb.charAt(1);
        sb.setCharAt(1, sb.charAt(2));
        sb.setCharAt(2,tmp);
        //输出加密后的结果
        System.out.println("加密后的结果为:"+sb);
    }
}

暂时写这么一点,有时间就更新一些题目了。

你可能感兴趣的:(java,学习,笔记)