java程序设计基础训练一(16-22)

16.

【问题描述】

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

【输入形式】

输入一个整数int类型
【输出形式】

这个数转换成2进制后,输出1的个数

【样例输入】

5

【样例输出】

2

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int cnt=0;
        while(n!=0){
            if(n%2==1){
                cnt++;
            }
            n=n/2;
        }
        System.out.println(cnt);
    }
}

17.

【问题描述】有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

【输入形式】输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。

【输出形式】对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

【样例输入】 3 10 81 0 

【样例输出】   1 5 40

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int myg;
        myg=in.nextInt();
        //in.nextLine();
        while(myg!=0){
            int cnt=0;
            while(myg>=3){
                cnt+=myg/3;
                myg=(myg/3)+(myg%3);
            };
            if(myg==2){
                cnt++;
                myg=in.nextInt();
                //in.nextLine();
            }
            else if(myg==1){
                myg=in.nextInt();
                //in.nextLine();
            }
            System.out.print(cnt+" ");
        }

    }
}

18.

【问题描述】某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。

【输入形式】每组输入有两行,第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。

【输出形式】每组输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。

【样例输入】

300 207 155 300 299 170 158 65

【样例输出】 6

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int[] arr=new int[n];
        int[] dp=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=in.nextInt();
            dp[i]=0;
        }

        int index=0;
        int temp=0;
        int max=0;

        for(int i=0;i<n;i++){
            temp=0;
            index=0;
            for(int j=0;j<i+1;j++){
                if(arr[i]<=arr[j]){
                    if(temp<=dp[j]){
                        index=j;
                        temp=Math.max(temp,dp[j]);
                    }
                }
            }
            dp[i]=dp[index]+1;
            max=Math.max(max,dp[i]);
        }
        System.out.print(max);
    }
}

19.

【问题描述】 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。子网掩码与 IP 地址结构相同,是32 位二进制数,其中网络号部分全为 “1”  和主机号部分全为 “0” 。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP 地址分别与它们的子网掩码相 “与” 后的结果相同,则说明这两台主机在同一子网中。示例:IP 地址192.168.0.1子网掩码255.255.255.0转化为二进制进行运算:IP地址11010000.10101000.00000000.00000001子网掩码11111111.11111111.11111111.00000000 AND运算11010000.10101000.00000000.00000000转化为十进制后为:192.168.0.0 IP 地址 192.168.0.254子网掩码 255.255.255.0转化为二进制进行运算:IP地址11010000.10101000.00000000.11111110子网掩码11111111.11111111.11111111.00000000 AND运算11010000.10101000.00000000.00000000 转化为十进制后为:192.168.0.0 通过以上对两台计算机IP 地址与子网掩码的 AND 运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。

【输入形式】输入子网掩码、两个地址

【输出形式】得到计算结果,如不在同一子网,则输出0

【样例输入】

 255.255.255.0 

 192.168.224.254 

 192.168.10.4 

【样例输出】

 0

import java.util.Scanner;
public class Main {
    public static String transfer(String str){
        int a=Integer.parseInt(str);
        int[] arr={0,0,0,0,0,0,0,0};
        int i=7;
        if(a<0||a>255){
            return "00000000";
        }
        while(a>1){
            int myw=a%2;
            arr[i]=myw;
            a=a/2;
            i--;
        }
        arr[i]=a;
        String ans="";
        for(int j=0;j<8;j++){
            ans+=arr[j];
        }
        return ans;

    }
    public static String dyb(String b){
        String[] strarr=b.split("\\.");
        String ejz="";
        for(int i=0;i<4;i++){
            if (!strarr[i].isEmpty()) {
                ejz+=transfer(strarr[i]);
            }
            else{
                ejz+="00000000";
            }
        }
        return ejz;
    }

    public static String and(String ym,String ip){
        String ans="";
        int len=ym.length();
        for(int i=0;i<len;i++){
            if(ym.charAt(i)==ip.charAt(i)&&ym.charAt(i)=='1'){
                ans+="1";
            }
            else{
                ans+="0";
            }
        }
        return ans;
    }

    public static int judge(String stra,String strb){
        int len=stra.length();
        for(int i=0;i<len;i++){
            if (stra.charAt(i)!=strb.charAt(i)){
                return 0;
            }
        }
        return 1;
    }

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        String zwym=in.nextLine();
        String ip1=in.nextLine();
        String ip2=in.nextLine();
        zwym=dyb(zwym);
        ip1=dyb(ip1);
        ip2=dyb(ip2);
        String and1=and(zwym,ip1);
        String and2=and(zwym,ip2);
        if(judge(and1,and2)==0){
            System.out.print("0");
        }
        else{
            System.out.print("1");
        }
    }
}

20.

【问题描述】你的朋友提议玩一个游戏:将写有数字的的n纸片放入口袋中,你可以从口袋中抽取三次纸片,每次记下纸片上的数字后都将其放回到口袋中,如果这三个数字的和是m,就是你赢,否则就是你朋友赢。请你编写一个程序,判断当纸片上所写的数字是k1,k2,…,kn时是否存在抽取三次之和为m的方案。 

【输入形式】输入的第一行为一个正整数 n 表示口袋中纸片数目(int类型)第二行为一个正整数表示三个数字的和 第三行为n个整数表示每个纸片上的数字(int类型)

【输出形式】如果存在符合要求的方案,输出Y,否则,输出N。

【样例输入】

 3

 10

 2 3 5

【样例输出】

  Y

import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        in.nextLine();
        int s=in.nextInt();
        in.nextLine();
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=in.nextInt();
        };
        Arrays.sort(arr);
        int flag=0;
        for(int i=0;i<n-2;i++){
            int sum=0;
            sum+=arr[i];
            if(arr[i]>=s){
                break;
            }
            else{
                for(int j=i+1;j<n-1;j++){
                    sum+=arr[j];
                    if(arr[j]>s||sum>s){
                        break;
                    }
                    else{
                        for(int k=j+1;k<n;k++){
                            sum+=arr[k];
                            if(arr[k]>s||sum>s){
                                break;
                            }
                            if(sum==s){
                                flag=1;
                                break;
                            }
                        }
                    }
                }
            }

        };
        if(flag==1){
            System.out.println('Y');
        }
        else{
            System.out.println('N');
        };

    }
}

21.

【问题描述】老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

【输入形式】输入包括多组测试数据。每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。 学生ID编号从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩,接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为'Q'的时候, 表示这是一条询问操作,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少,当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

【输出形式】对于每一次询问操作,在一行里面输出最高成绩.

【样例输入】

 5 7 

 1 2 3 4 5 

 Q 1 5

 U 3 6

 Q 3 4

 Q 4 5

 U 4 5

 U 2 9

 Q 1 5

【样例输出】5 6 5 9

import java.util.Scanner;
import java.util.Arrays;
public class Main {

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int m=in.nextInt();
        in.nextLine();
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=in.nextInt();
        };
        in.nextLine();
        String myh;
        for(int i=0;i<m;i++){
            myh=in.nextLine();
            String[] myharr=myh.split(" ");
            String a=myharr[0];
            int b=Integer.parseInt(myharr[1]);
            int c=Integer.parseInt(myharr[2]);
            if(a.equals("Q")){
                int ma=0;
                for(int j=b-1;j<=c-1;j++){
                    if(arr[j]>=ma){
                        ma=arr[j];
                    }
                }
                System.out.print(ma+" ");
            }
            else if(a.equals("U")){
                arr[b-1]=c;
            };
        }
    }
}

22.

【问题描述】吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,这对数字各包含乘积的一半位数的数字,数字选取后可任意排序,例如: 1260=21×60  1827=21×87   2187=27×81。写出一个程序,找出4位数的所有吸血鬼数字。

【输入形式】无

【输出形式】输出所有的吸血鬼数字,数字之间已空格分隔。

【样例输入】无

【样例输出】1260 1395 1435 1530 1827 2187 6880

public class Main {
    public static boolean judge(int s){
        String m01=Integer.toString(s);
        String m02=Integer.toString(s);
        String m03=Integer.toString(s);
        String m04=Integer.toString(s);
        String m1=Integer.toString(s);
        String m2=Integer.toString(s);
        String m3=Integer.toString(s);
        String m4=Integer.toString(s);
        for(int i=0;i<3;i++){
            for(int j=i+1;j<4;j++){

                int a1=Integer.parseInt(""+m1.charAt(i)+m1.charAt(j));
                String btemp1=m01.replaceFirst(""+m1.charAt(i),"");
                int b1=Integer.parseInt(btemp1.replaceFirst(""+m1.charAt(j),""));
                if(a1*b1==s){
                    return true;
                }

                int a2=Integer.parseInt(""+m2.charAt(j)+m2.charAt(i));
                String btemp2=m02.replaceFirst(""+m2.charAt(i),"");
                int b2=Integer.parseInt(btemp2.replaceFirst(""+m2.charAt(j),""));
                if(a2*b2==s){
                    return true;
                }

                int a3=Integer.parseInt(""+m3.charAt(i)+m3.charAt(j));
                String btemp3=m03.replaceFirst(""+m3.charAt(i),"");
                int b3=Integer.parseInt(btemp3.replaceFirst(""+m3.charAt(j),""));
                int b3temp=b3;
                b3=b3temp/10+(b3temp%10)*10;
                if(a3*b3==s){
                    return true;
                }

                int a4=Integer.parseInt(""+m4.charAt(i)+m4.charAt(j));
                String btemp4=m04.replaceFirst(""+m4.charAt(i),"");
                int b4=Integer.parseInt(btemp4.replaceFirst(""+m4.charAt(j),""));
                int b4temp=b4;
                b4=b4temp/10+(b4temp%10)*10;
                if(a4*b4==s){
                    return true;
                }


            }
        }
        return false;
    }


    public static void main(String[] args) {
        int myg;
        for(int i=1000;i<=9999;i++){
            if(judge(i)){
                System.out.print(i+" ");
            }

        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值