北理工java第三周作业

第一题

第一个案例就告诉我们,只需要前3个数

显然有两种特殊案例

1是第一个个数为0.则需要用0占位

2是第二个个数为零,则不需要占位,直接输出

我的第一种想法是一个字符一个字符的输入,然后截止到n位

第二种想法是把整行输入,再拼接

我尝试第二种方法,但是java报错了

可能是nextLine();

把换行符读入了

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Scanner;

public class W3T11 {

    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);

        InputStreamReader ins = new InputStreamReader(System.in);

        BufferedReader br = new BufferedReader(ins);

        String num;

        num=sc.next();

        int n = Integer.parseInt(num);

        if(n!=0){

            String str1,str2,str3;

            try {

                str1=  br.readLine();

            } catch (IOException e) {

                throw new RuntimeException(e);

            }

            str1=str1.substring(0,n*2);

            num=sc.next();

            int m = Integer.parseInt(num);

            if(m!=0){

                str2=br.readLine();

                str2=str2.substring(0,m*2);

                str3= new StringBuilder().append(str1).append(str2).toString();

                System.out.println(str3);

            }

            else {

                System.out.println(str1);

            }

        }





    }

}

所以得换一种

没办法,只有存成一个个数字

这里排序可以用自带的函数偷懒(数组和字符串)

import java.util.Arrays;  

int[] nums = {2,5,0,4,6,-10};

    Arrays.sort(nums);


int[] nums = {2,5,0,4,1,-10};

        //对前四位元素进行排序

        Arrays.sort(nums, 0, 4);

        for(int i :nums)

            System.out.print(i+" ");

        /* 之前:2 5 0 4 1 -10

         * 结果:0 2 4 5 1 -10

         */


int[] nums = {2,5,0,4,1,-10};

        Arrays.fill(nums, 1);

        for(int i :nums)

            System.out.print(i+" ");

        /* 之前:2 5 0 4 1 -10

         * 结果:1 1 1 1 1 1

         */


int[] nums = {2,5,0,4,1,-10};

        //对数组元素下标2到4的元素赋值为3

        Arrays.fill(nums,2,5,3);

        for(int i :nums)

            System.out.print(i+" ");

        /* 之前:2 5 0 4 1 -10

         * 结果:2 5 3 3 3 -10

         */

    int[] nums = {2,5,0,4,1,-10};

    System.out.println(Arrays.toString(nums));

    /*

     * 结果:[2, 5, 0, 4, 1, -10]

     */

看同学的代码才知道,之前一直处理不了的输入问题,因为回车不会被nextInt录入,所以要用nextLine吃掉回车

String与各种类型互转

取第一个字符

import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        String str1,str2;
        int m,n;
        Scanner scanner = new Scanner(System.in);
        m=scanner.nextInt();
        scanner.nextLine();
        str1=scanner.nextLine();
        n=scanner.nextInt();
        scanner.nextLine();
        str2=scanner.nextLine();
        String[] num1s=new String[m];
        String[] num2s=new String[n];
        long[] num1=new long[m];
        long[] num2=new long[n];
        Arrays.fill(num1s,"");
        Arrays.fill(num2s,"");
        int i,j=0;
        for(i=0;i<m;i++) {
            while (str1.charAt(j)!=' ') {
                num1s[i]+=str1.charAt(j);
                j++;
            }
            j++;
            num1[i]= Long.parseLong(num1s[i]);
        }
        j=0;
        str2+=' ';
        for(i=0;i<n;i++) {
            while (str2.charAt(j)!=' ') {
                num2s[i]+=str2.charAt(j);
                j++;
            }
            j++;
            num2[i]= Long.parseLong(num2s[i]);
        }
        long[] num=new long[m+n];
        int k=0;
        for(i=0,j=0;k<m+n;k++) {
            if(i==m) {
                num[k]=num2[j];
                j++;
            }
            else if(j==n) {
                num[k]=num1[i];
                i++;
            }
            else if(num1[i]<num2[j]) {
                num[k]=num1[i];
                i++;
            }
            else {
                num[k]=num2[j];
                j++;
            }
        }
        for(i=0;i<m+n-1;i++) System.out.printf("%d ",num[i]);
        System.out.println(num[i]);
    }
}  

第二题

他说了不要硬算,应该就是计算2和5为因子出现的次数

最后计算两者的最小值就行

显然要用bigteger

然后循环的条件需要用它们比大小,之前作业里介绍的函数少了一个

package com.yiibai;import java.math.*;public class BigIntegerDemo {public static void main(String[] args) {


// create 2 BigInteger objects


BigInteger bi1, bi2;


bi1 = new BigInteger("6");


bi2 = new BigInteger("3");


// create int object


int res;


// compare bi1 with bi2


res = bi1.compareTo(bi2);


String str1 = "Both values are equal ";


String str2 = "First Value is greater ";


String str3 = "Second value is greater";


if( res == 0 )


System.out.println( str1 );


else if( res == 1 )


System.out.println( str2 );


else if( res == -1 )


System.out.println( str3 );


}}

让我们编译和运行上面的程序,这将产生以下结果:

First Value is greater

不过我觉得出题人挺sb的,学java天天不练别的,就和biginteger过不去,这又不是多难的算法,就是得找对应的大数字函数。

第一次除错,是因为应加上5或2的多少次方

但是我估计用这么多biginteger又得超时,他奶奶滴

换一种想法

因为2比5多得多,所以只用考虑5

比如100,先除以5,有20个5的倍数,一直除,直到比5小,就没有5了

import java.math.BigInteger;
import java.util.Scanner;
public class W3T2 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String num;
        num=sc.next();
        BigInteger b=new BigInteger(num);
        BigInteger ans=BigInteger.valueOf(0);
        BigInteger shu5= b.divide(BigInteger.valueOf(5));
        BigInteger a=BigInteger.valueOf(1);
        while(shu5.compareTo(BigInteger.valueOf(0))!=0){
            ans=ans.add(shu5);
            shu5=shu5.divide(BigInteger.valueOf(5));

        }

        System.out.println(ans);

    }
}

第三题这个又是我最不熟悉的字符串。。

看了题目就想到解法了,但是可惜java没指针

我们需要四个指针,我们命名为1.2.3.4一对指针指向两个头节点,首先2和4比对,相同的话把12.34向后移动,不相同的话,4向后移动,继续比对,假如存在相同的,就把4再向后移动一次,3再移动到4处,假如4到最后也没有相同的话,就把1和2往后挪一位,4回到3处

显然这样一个一个比对可能有答案但不一定是最优解,那么我们再让3.4为首选位,移动1.2一次,比对两次得到的解,看谁的更长用谁的

这是另一种解法

import java.util.Arrays;
import java.util.Scanner;

public class Atest {

    public static int[][] LCSLength ( char[] x, char[] y) {

        int m = x.length;

        int n = y.length;

        int[][] b = new int[x.length][y.length];

        int[][] c = new int[x.length][y.length];

        for(int i = 1; i < m; i++) {

            c[i][0] = 0;

        }

        for(int i = 1; i < n; i++) {

            c[0][i] = 0;

        }

        for(int i = 1; i < m; i++) {

            for(int j = 1; j < n; j++) {

                if(x[i] == y[j]) {

                    c[i][j] = c[i-1][j-1] + 1;

                    b[i][j] = 1;

                }

                else if(c[i-1][j] >= c[i][j-1]) {

                    c[i][j] = c[i-1][j];

                    b[i][j] = 2;

                }

                else {

                    c[i][j] = c[i][j-1];

                    b[i][j]=3;

                }

            }

        }

        return b;

    }

    public static void LCS(int[][] b, char[] x, int i, int j) {

        if(i == 0|| j == 0) return;

        if(b[i][j] == 1) {

            LCS(b,x,i - 1, j - 1);

            System.out.print(x[i]);

        }

        else if(b[i][j] == 2) {

            LCS(b,x,i - 1, j);

        }

        else LCS(b,x,i, j-1);

    }

    public static void main(String args[]) {


        String num;
        int m,n;
        Scanner scanner = new Scanner(System.in);
        num=scanner.next();
        int len1,len2;
        len1=num.length();
        char[] x,y;
        x=num.toCharArray();
        num=scanner.next();
        len2=num.length();
        y=num.toCharArray();
        x = Arrays.copyOf(x, len1+1);
        y = Arrays.copyOf(y, len2+1);

        for(int i = len1;i>0;i--){
            x[i]=x[i-1];
        }
        x[0]=' ';
        for(int i = len2;i>0;i--){
            y[i]=y[i-1];
        }
        y[0]=' ';

        int[][] b = LCSLength(x, y);



        LCS(b, x, x.length - 1, y.length - 1);
        System.out.println();

    }
}

第四题

出题人的意图是让我们掌握自定义函数,但是对于我来说,最难的是处理输入输出。。各种格式问题,比如怎么把数字录入到数组里(java)的各种格式转换真的丑陋

这里有个遍历的操作,String data: nu

前面的循环函数只能用for

写了一半才看到全是Long,奶奶滴,这不是考验写方法吗,怎么所有的都要用大数据

可能是为了算法超时

然后需要用函数去递归这个数组

第一次debug原因是字符串相等不能用==

要用func.equals("gcdi")

第二次debug原因是字符串输入用的.next而应该用.nextLine

提交之后两个WA

原因可能是最大公倍数我用的暴力计算

算法是两个数除以最大公约数再相乘就是最小公倍数,

但发现不是,其实是lcmu打错了,果然不改算法就TLE了

import java.util.Arrays;
import java.util.Scanner;
public class W3T4 {
    public static long som(long x, long y) {
        return (x + y);
    }

    public static long mini(long x, long y) {
        if (x > y) {
            return y;
        } else return x;
    }

    public static long maxi(long x, long y) {
        if (x > y) {
            return x;
        } else return y;
    }
    public static long gcdi(long x, long y) {
        x = Math.abs(x);
        y = Math.abs(y);
        if (y == 0) {
            return x;
        }

        else return gcdi(y,x%y);
    }
    public static long lcmu(long x, long y) {
        return Math.abs(x/gcdi(x,y)*y);
    }


    public static void main(String[] args){
        String num,fct;
        Scanner scanner = new Scanner(System.in);
        fct=scanner.nextLine();
        long arr[]=new long[200];
        num=scanner.nextLine();
        String nu[]=num.split(" ");
        int n=0;
        for(String data : nu){
            arr[n]=Long.parseLong(data);
            n++;
        }
        num=scanner.next();
        long  init=Long.parseLong(num);
        long ans[]=new long[200];
        if(fct.equals("som")){
            for(int i=0;i<n;i++){
                ans[i]=som(init,arr[i]);
                init=ans[i];
            }
        }
        if(fct.equals("mini")){
            for(int i=0;i<n;i++){
                ans[i]=mini(init,arr[i]);
                init=ans[i];
            }
        }
        if(fct.equals("maxi")){
            for(int i=0;i<n;i++){
                ans[i]=maxi(init,arr[i]);
                init=ans[i];
            }
        }
        if(fct.equals("lcmu")){
            for(int i=0;i<n;i++){
                ans[i]=lcmu(init,arr[i]);
                init=ans[i];
            }
        }
        if(fct.equals("gcdi")){
            for(int i=0;i<n;i++){
                ans[i]=gcdi(init,arr[i]);
                init=ans[i];
            }
        }
        for(int i=0;i<n;i++){
            if(i!=n-1){
                System.out.print(ans[i]+" ");
            }
            else System.out.println(ans[i]);
        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值