北理工java第二周作业

Java的题目相较于Python 平均难度都要大一点,我们先从第二次课后习题开始

首先第一题,出题人的意思是想让我们在java里面定义新函数

public static int computing(int num)

也就是比c多一个public static

然而数组超了,int 不够大

得用BigInteger

BigInteger abs()  返回大整数的绝对值

BigInteger add(BigInteger val) 返回两个大整数的和

BigInteger and(BigInteger val)  返回两个大整数的按位与的结果

BigInteger andNot(BigInteger val) 返回两个大整数与非的结果

BigInteger divide(BigInteger val)  返回两个大整数的商

double doubleValue()   返回大整数的double类型的值

float floatValue()   返回大整数的float类型的值

BigInteger gcd(BigInteger val)  返回大整数的最大公约数

int intValue() 返回大整数的整型值

long longValue() 返回大整数的long型值

BigInteger max(BigInteger val) 返回两个大整数的最大者

BigInteger min(BigInteger val) 返回两个大整数的最小者

BigInteger mod(BigInteger val) 用当前大整数对val求模

BigInteger multiply(BigInteger val) 返回两个大整数的积

BigInteger negate() 返回当前大整数的相反数

BigInteger not() 返回当前大整数的非

BigInteger or(BigInteger val) 返回两个大整数的按位或

BigInteger pow(int exponent) 返回当前大整数的exponent次方

BigInteger remainder(BigInteger val) 返回当前大整数除以val的余数

BigInteger leftShift(int n) 将当前大整数左移n位后返回

BigInteger rightShift(int n) 将当前大整数右移n位后返回

BigInteger subtract(BigInteger val)返回两个大整数相减的结果

byte[] toByteArray(BigInteger val)将大整数转换成二进制反码保存在byte数组中

String toString() 将当前大整数转换成十进制的字符串形式

BigInteger xor(BigInteger val) 返回两个大整数的异或

public static BigInteger computing(int num){
    BigInteger ans = BigInteger.valueOf(2);

    for (int i = 0; i < num-1; i++) {

        ans=ans.multiply(BigInteger.valueOf(2));
    }
    return ans;
}

第二题,需要一个函数不定个输入

public static double max(double... values) {//不要怀疑,...就是合法的语法

    double max = Double.NEGATIVE_INFINITY;//无穷小(负无穷)

    for (double d : values) {//for each

        if (d > max) {

            max = d;

        }

    }

    return max;

}

输入的括号里(类型+三个点+会被赋值的变量)

double类型的无穷小 就是Double.NEGATIVE_INFINITY

 之后想引用values里的值,就用:

显然当values无值的时候for就自动停止了

大题第一题

显然要把输入转为double类型,据说用递归会爆栈,所以用for就问题不大

import java.util.Scanner;

public class Zhou2T1 {

    public static void main(String[] args){

        Scanner sc=new Scanner(System.in);

        String num;

        num=sc.next();

        double x=Double.parseDouble(num);

        num=sc.next();

        double n=Double.parseDouble(num);

        double temp=1.0;

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

            temp=x/(i+temp);



        }

        System.out.printf("%.2f\n",temp);

    }



}

然后第三题我一看到就想到数结结构里学的栈

public interface Stack<E> extends Iterable<E> {

   

    //获取栈的size大小

    public int size();

   

    //判断栈是否为空

    public boolean isEmpty();


    //入栈 进栈一个元素 在线性表的表尾添加一个元素

    public void push(E element);


    //出栈 弹出一个元素 在线性表的表尾删除一个元素

    public E pop();


    //查看当前栈顶元素 并不是移除 查看线性表中最后一个元素

    public E peek();


    //对当前栈进行清空

    public void clear();

}



import java.util.Stack;
import java.util.Scanner;
public class Main {
    public static boolean isValid(String s) {

        Stack<Character> stack = new Stack<Character>();

        for(char c: s.toCharArray()){

            if(c=='('){
                stack.push(')');
            }
            else if(c=='['){
                stack.push(']');
            }
            else if(c=='{'){
                stack.push('}');
            }
            else if(stack.isEmpty()||c!=stack.pop()){

                return false;
            }
        }
        return stack.isEmpty();
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String num;
        num=sc.next();
        isValid(num);
        System.out.println(String.valueOf(isValid(num)));
    }
}

记住最后的结果要加换行就行

第三题,看示例就知道的用BigInteger
这里用到了compareTo函数,注意我这里怎么把String转成BigInteger类型的

最后提交了WA了一个,看了同学说的才知道是有负数

 
import java.util.Scanner;
import java.math.BigInteger;
public class Zhou2T3 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String num;
        num=sc.next();
        BigInteger b=new BigInteger(num);
        if(b.compareTo(BigInteger.valueOf(0))==1){
            BigInteger ans = BigInteger.valueOf(1);
            for(;;){
                BigInteger dou =ans.multiply(ans);
                BigInteger tri =dou.multiply(ans);
                if(b.compareTo(tri)==0){
                    System.out.println(ans);
                    System.exit(0);
                } else if (b.compareTo(tri) == -1  ) {
                    System.out.println(ans.subtract(BigInteger.valueOf(1)));
                    System.exit(0);

                }
                ans=ans.add(BigInteger.valueOf(1));
            }
        }
        else{
            BigInteger ans = BigInteger.valueOf(-1);
            for(;;){
                BigInteger dou =ans.multiply(ans);
                BigInteger tri =dou.multiply(ans);
                if(b.compareTo(tri)==0){
                    System.out.println(ans);
                    System.exit(0);
                } else if (b.compareTo(tri) == 1   ) {
                    System.out.println(ans);

                    System.exit(0);

                }
                ans=ans.subtract(BigInteger.valueOf(1));
            }

        }




    }

}

第四题,求余就不用说了吧,注意最后的输出,不是只给个数就行,得输出整个式子,所以这题的考点就是怎么输出,其实和C的输出一样,要用printf,记得转换说明符

然后WA了三个

bigInteger不能和Int类型的同时用,=号,也只能和自己类型的等于,想和别的类型一起玩就要
BigInteger.valueOf()

这个括号里可以是常数,也可以是不属于big类型的变量

加减乘除比大小都有别的函数才能用,合理推测是把它当字符串按位操作

BigInteger转INT

BigInteger a = 1;

int b = a.intValue();

String转long

int转long可以先转String再转long

long temp= Long.parseLong(a);

我怀疑是超了int,用BigInteger再试试

好家伙,过了一个,但是超时了,第一次java超时。。。

然后难道得用long?

哪怕是用Long 最后一个值的时长也很危险第三个又变回WA了

看到有个快速幂,试试

结果是快了一倍,时长还是超了,没办法,只有先问问助教了

说是有可以算a ^ b mod p的算法

原来做法是不算出a^b这个大数,直接得结果,可以的

看不懂,直接看不懂。。。



import java.util.Scanner;
public class Zhou4T4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        long a=scanner.nextLong();
        long b=scanner.nextLong();
        long p=scanner.nextLong();
        String s=a+"^"+b+" mod "+p+"=";
        long ans=1;
        a%=p;
        while (b>0){
            if(((b&1)==1)){
                ans=(ans*a)%p;
            }
            a=(a*a)%p;
            b>>=1;
        }
        System.out.println(s+ans);
    }
}

第五题,似乎不难,不过老师说的用BigInteger来表示计算结果,考虑下负数就行,这题比前几题简单多了

import java.math.BigInteger;
import java.util.Scanner;
public class Zhou2T5 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String num;
        num=sc.next();
        int n = Integer.parseInt(num);
        if(n<0){
            System.out.println(0);System.exit(0);
        }
        else {
            BigInteger ans = BigInteger.valueOf(0);
            for(int i=1;i<n;i++){
                if(i%3==0){
                    ans=ans.add(BigInteger.valueOf(i));
                }
                if(i%5==0){
                    ans=ans.add(BigInteger.valueOf(i));
                }
                if(i%15==0){
                    ans=ans.subtract(BigInteger.valueOf(i));
                }
            }
            System.out.println(ans);System.exit(0);
        }


    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值