CRRE JAVA 第一章部分习题
1.写个程序,读取一个整数并以二进制,八进制和十六进制输出,以十六进制浮点数输出倒数。
代码
package PART1;
import java.util.Scanner;
/*
写个程序,读取一个整数并以二进制,八进制和十六进制输出,以十六进制浮点数输出倒数。
*/
public class p1_1{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入一个整数:");
Integer a = in.nextInt();
System.out.println("二进制:"+Integer.toString(a,2));
System.out.println("八进制:0"+Integer.toString(a,8));
System.out.println("十六进制:0x"+Integer.toString(a,16));
double b = 1.0/a;
System.out.printf("%A",b);
}
}
输出
请输入一个整数:524
二进制:1000001100
八进制:01014
十六进制:0x20c
浮点数:0X1.F44659E4A4271P-10
总结
- 输入:
- 用Scanner类,需导入java.util.Scanner;
- Interger类:
- public static String toString(int i, int radix)
将 int 转换为 String,以 radix 为进制。
- public static String toString(int i, int radix)
- 输出:
- System.out.println();
- System.out.printf();
使用方法同C语言;
- 进制:
- 二进制输出无占位符;
- 八进制,以0开头,占位符:%o;
- 十六进制,以0x开头,占位符:%x;
- %a,%A:读入一个浮点值。
2.写个程序,它读取整数,然后经过模运算转换为 0° ~ 359° 之间的值。首先以操作符 % 完成,然后再试 floorMod。
代码
package PART1;
import java.util.Scanner;
/*
写个程序,它读取整数,然后经过模运算转换为 0° ~ 359° 之间的值。首先以操作符 % 完成,然后再试 floorMod。
*/
public class p1_2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("输入一个整数:");
int a = scanner.nextInt();
System.out.println("取余%:"+a%360);
System.out.println("floorMod:"+Math.floorMod(a,360));
}
}
输出
输入一个整数:-654
取余%:-294
floorMod:66
输入一个整数:524
取余%:164
floorMod:164
总结
%与floorMod的区别
在matlab中,关于取余和取模是这么定义的:
当y≠0时:
取余:rem(x,y)=x-y.fix(x./y)
取模:mod(x,y)=x-y.floor(x./y)
其中,fix()函数是向0取整,floor()函数是向负无穷取整
eg:
5 / (-3) 约等于-1.7
在取余运算时候商值向0方向舍弃小数位于是fix(-1.7) = -1
取余结果 : 5 - (-3)(-1) = 2
在取模运算时商值向负无穷方向舍弃小数位于是 floor(-1.7) = -2
取模结果 : 5 - (-3)(-2) = -1
符号对照表
x | y | x%y | Math.floorMod(x,y) |
---|---|---|---|
- | + | - | + |
+ | - | + | - |
- | - | - | - |
+ | + | + | + |
- 取余:结果符号和被除数一致;
- 取模:结果符号和除数一致。
3.只用条件操作符,写一个程序,读取三个整数并输出最大的。使用 Math.max 实现同样的功能。
代码
package PART1;
import java.util.Scanner;
public class p1_3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a,b,c;
int max1,max2;
System.out.print("请输入第一个整数:");
a=scanner.nextInt();
System.out.print("请输入第二个整数:");
b=scanner.nextInt();
System.out.print("请输入第三个整数:");
c=scanner.nextInt();
//条件操作符
max1=a>b?a:b;
max1=max1>c?max1:c;
System.out.println("经条件运算符运算,三者中最大的数为:"+max1);
//Math.max
max2=Math.max(a, b);
max2=Math.max(max2, c);
System.out.println("经Math.max运算,三者中最大的数为:"+max2);
}
}
输出
请输入第一个整数:35
请输入第二个整数:5463
请输入第三个整数:435
经条件运算符运算,三者中最大的数为:5463
经Math.max运算,三者中最大的数为:5463
总结
- 条件运算符:
关系表达式 ? 表达式1 : 表达式2 - Math.max方法还可写成
Math.max(Math.max(a, b), c);
6.写个程序,计算阶乘 n! = 1 × 2 × ... × n,使用 BigInteger。计算 1000 的阶乘。
代码
package PART1;
import java.math.BigInteger;
public class p1_6 {
private static BigInteger Nstage(int n) {
BigInteger result = new BigInteger("1");
for (int i = 1; i <= n; i++) {
BigInteger num = new BigInteger(String.valueOf(i));
result = result.multiply(num);// 调用自乘方法
}
return result;
}
public static void main(String[] args) {
System.out.println("1000的阶乘:"+Nstage(1000));
}
}
输出
1000的阶乘:402387260077093773543702433923003985……
总结
- none
8.写个程序,读取一个字符串并输出该字符串所有的非空子字符串。
代码
package PART1;
public class p1_8 {
public static void main(String[] args) {
String str = "I AM YOUR FATHER ";
String[] s = str.split("\\s");
for(String string:s) {
System.out.println(string);
}
System.out.println(s.length);
}
}
输出
I
AM
YOUR
FATHER
4
总结
- public String[] split(String regex,int limit)
- 第一个参数:分隔符,可以是正则表达式。
//正则表达式还没看到 CORE JAVA CHAPTER 9 - 第二个参数:控制切割次数
1.limit>0,切割 limit-1 次,数组长度不会大于切割次数。
2.limit<0,将切割尽可能多的次数,而且数组的长度是任何长度。
3.lilmit=0,将切割尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
limit若不写,默认为0.
- 第一个参数:分隔符,可以是正则表达式。
13.写个程序,可以输出一组彩票组合,该组合由 1~49 之间的 6 个不同数字组成。为产生 6 个不同数字,先用 1~ 49 填充一个数组。然后随机选择一个索引并删除对应元素,重复 6 次,并输出排序后的结果。
代码
package PART1;
/*写个程序,可以输出一组彩票组合,该组合由 1~49 之间的 6 个不同数字组成。
* 为产生 6 个不同数字,先用 1~ 49 填充一个数组。
* 然后随机选择一个索引并删除对应元素,重复 6 次,并输出排序后的结果。
*/
import java.util.Random;
public class p1_13 {
public static void main(String[] args) {
int[] a =new int[60];
for(int i=0;i<60;i++) {
a[i]=i+1;
}
Random random = new Random();
int[] b = new int[6];
for(int j = 49;j>43;j--) {
int randomInt = random.nextInt(j);
System.out.println("选中的随机数是:"+randomInt);
b[49-j]=a[randomInt];
for(int k=randomInt;k<=j;k++) {
a[k]=a[k+1];
}
}
System.out.println("选中的六个数:");
for(int x=0;x<6;x++)
System.out.println(b[x]);
int temp;
for(int i = 1;i<b.length;i++) {
for(int j=0;j<b.length-i;j++) {
if(b[j]>b[j+1]) {
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
}
System.out.println("排序后的六个数:");
for(int x=0;x<6;x++)
System.out.println(b[x]);
}
}
输出
选中的随机数是:33
选中的随机数是:22
选中的随机数是:17
选中的随机数是:30
选中的随机数是:2
选中的随机数是:12
选中的六个数:
34
23
18
33
3
14
排序后的六个数:
3
14
18
23
33
34
总结
- 数组初始化
- 静态初始化:自己确定每个数组元素的初始值,而数组的长度则由系统自己决定。
int[] a = {1,2,3,4,5}; - 动态初始化:初始化时由自己确定数组的长度,而每一个数组元素的值,则由系统来分配初始值。
int[] b=new int[5];
- 静态初始化:自己确定每个数组元素的初始值,而数组的长度则由系统自己决定。
- 随机数:Random
- import java.util.Random;
- 两种构造方法
1.Random():创建一个新的随机数生成器。
2.Random(long seed):使用单个 long 种子创建一个新的随机数生成器。
3.方法
1.protected int next(int bits)://生成下一个伪随机数。
2.boolean nextBoolean()://返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
3.void nextBytes(byte[] bytes)://生成随机字节并将其置于用户提供的 byte 数组中。
4.double nextDouble()://返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。
5.float nextFloat()://返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。
6.double nextGaussian()://返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
7.int nextInt()://返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
8.int nextInt(int n)://返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。
9.long nextLong()://返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
10.void setSeed(long seed)://使用单个 long 种子设置此随机数生成器的种子。
4.算法
1.删除元素用到链表中顺序表删除元素的方法;
2.排序:冒泡排序。