本次寒假学习的教材是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语法并且更好巩固,很明显可以发现,本质上还是考验算法功底,所以任重而道远!