北理工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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
北京理工大学成立于1940年,是中国一所以工科为主、工、理、管、文、法等多学科协调发展的综合性大学。乐学作业是北京理工大学的一种独特教育理念,强调学生在学习过程中的快乐体验和有效成果。 乐学作业的核心理念是让学生从传统的单一教学模式中解放出来,培养积极主动的学习态度和兴趣。同时,乐学作业也倡导理论与实践相结合,鼓励学生动手实践,锻炼解决问题的能力。 在乐学作业中,学生可以根据自己的兴趣和特长选择适合自己的课程和项目。学校提供了丰富的学科和专业,包括工程、科学、管理、文学、法学等多个领域。学生可以通过多种途径获取知识,例如课堂教学、实验研究、社会实践等。 乐学作业的教学方法也非常灵活多样。老师会根据学生特点和需求提供个性化指导,帮助学生克服学习困难。同时,学生在团队合作中也可以相互学习、相互促进。学校还注重培养学生的创新思维和实践能力,鼓励学生进行创新性的研究和项目实践。 乐学作业的目的是培养具备批判性思维、创新意识和实践能力的综合型人才。在这种教育理念下,学生可以更主动地参与学习,享受到学习的乐趣,并且能够更好地适应社会的发展和变化。 作为一所享有盛誉的高校,北京理工大学的乐学作业模式不仅在国内受到关注和推崇,也赢得了国际上的广泛认可。它为学生提供了全面的教育平台,培养了一批才华横溢的年轻人,为社会的进步和发展做出了重要贡献。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值