【Programming Abstractions in Java课后习题1】概览、方法、字符串

本次寒假学习的教材是Programming Abstractions in Java, Eric.S.Roberts——Java程序设计 基础、编程抽象与算法策略。之前已经接触Java了,所以对黑皮书接受尚可,这里多说一句,如果没有任何java基础看此黑皮书可能会比较累,这本书属于讲解理论偏多,但是课后习题的代码都还算不错。
首先对于Java学习需要配环境,这里不多说,直接看我此博客。Java环境配置。当然此前也写过相关的java比较,不过进度比较快没有进行系统的归纳和总结。Java学习

本次以主要笔记为内容,结合课后一些习题来巩固练习(接触了算法课后习题peace of cake了)。习题难度偏易,主要是为了更好掌握Java语言。

三节笔记

1.cmd运行:javac Main.java java Main
2.包声明:指明编译器到哪里查找这个程序用到的源文件 package

package edu.standford.cs.javacs2,ch1

3.导入语句 ,java定义了若干个库

import java.until.Scanner

4.类定义:Java要求所有公共类都要定义在名字由类名和.java源文件中。Java只支持方法,不关联类的独立函数是不允许的。

public static void main(String[] args){
	new classname().run();
}

5.常量定义:static关键词表示这个变量属于这个类而不是属于类的对象,final表示不能修改了。

public static final double PI=3.141926

6.数据类型简述,这里就简单说一下int型,是2的31次方左右,可见在做大数计算时,使用java是明智的选择。值得一提的是,如果数字以0开头,那么此数为8进制。
7.Java中的方法与传统编程语言的函数很类似,唯一的不同在于方法隶属于类。最好所有的方法设置为private

//方法定义
修饰符(public/private) 类型 名字(参数){
	方法体
}

8.Math库常用的静态方法

Math.PI/E
Math.sqrt(x)
Math.min(x,y)/max(x,y)
Math.pow(x,y)
Math.random()

9.重载:将同一个名字用于一个方法的多个版本的做法。
10.String类及相关操作在java.lang已经包含,所以没有具体的import语句。
如果是输入

Scanner sysin=new Scanner(System.in);
String str=sysin.nextLine();

11.遍历字符串

for(int i=0;i<str.length();i++){
	操作str.charAt(i)
}

一些题目练习

以下题目均来自课后习题。

完美数

题目:编写一个谓词方法,接受一个整数n,n是完美数就返回true,在主程序调用时范围是1-9999,输出完美数。
完美数:数字和各个真因子和相等,例如6=1+2=3

public class Main{
    public static boolean isPerfect(int n){
        int sum=0;
        for(int i=1;i<n;i++){
            if(n%i==0){
                sum+=i;
            }
        }
        return sum==n?true:false;
    }
    public static void main(String[] args){
        for(int i=2;i<9999;i++){
            if(isPerfect(i)){
                System.out.print(i+" ");
            }
        }
    }
}

1729

题目:编写一个java程序,判断1729是最小的可以用2中方式表示为两个立方数之和的数字。1729= 1³ + 12³ = 9³ + 10³

public class Main{
    public static int lifang(int n){
        return n*n*n;
    }
    public static boolean Raman(int n){
        for(int a=1;a<Math.sqrt(n);a++){
            for(int b=1;b<Math.sqrt(n);b++){
                for(int c=1;c<Math.sqrt(n);c++){
                    for(int d=1;d<Math.sqrt(n);d++){
                        if(n==lifang(a)+lifang(b)&&n==lifang(c)+lifang(d)&&(a!=c)&&(a!=d)&&(b!=c)&&(b!=d)) return true;
                    }
                }
            }
        }
        return false;
    }
    public static void main(String[] args){
        for(int i=2;;i++){
            if(Raman(i)){
                System.out.println(i);
                break;
            }
        }
    }
}

大数运算

对于大数类的运算来讲,c/c++可以用字符串数组来做,但是,发现一种更厉害的一种语言来解决这种类型的题目,那就是java,java中的大数类是解决大数运算很好的办法:BigInteger大数类。

import java.util.Scanner;  //输入函数
import java.math.BigInteger;    //大数函数
public class Main {
   public static void main(String[] args) {
       Scanner sc=new Scanner(System.in);
       BigInteger a=sc.nextBigInteger();
       BigInteger b=sc.nextBigInteger();
       System.out.println(a.add(b));  //这个就是最后a+b
   }
}

1.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a. add(b);
2.subtract(); 相减
3.multiply(); 相乘
4.divide(); 相除取整
5.remainder(); 取余
6.pow(); a.pow(b)=a^b
7.gcd(); 最大公约数
8.abs(); 绝对值
9.negate(); 取反数

组合数

编写java程序,运算C(n,k)

import java.util.Scanner;
public class Main{
    public static int fact(int n){
       int res=1;
       for(int i=1;i<=n;i++){
           res*=i;
       }
       return res;
    }
    public static int C(int n,int k){
        return fact(n)/fact(n-k)*fact(k);
    }
    public static void main(String[] args){
        Scanner sysin=new Scanner(System.in);
        int n=sysin.nextInt();
        int k=sysin.nextInt();
        System.out.println(C(n,k));
    }
}

总结

以上题目训练只是接触java语法并且更好巩固,很明显可以发现,本质上还是考验算法功底,所以任重而道远!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值