返回 Java编程练习目录
《编程导论(Java)·5.3数组》介绍了Java数组的知识,我们现在需要用足够的代码练习数组的使用。
几个要点:
- Zero-based indexing.数组的元素不能够自由的命名;通过下标 (index)被自动编号为arr[0]到arr [arr.length -1]。
- 数组是隐含的类,任意数组都是Object的子类。有公有成员变量length;数组的元素相当于数组的成员变量,被系统自动(至少)默认初始化。
- 数组的遍历:传统for语句或for-each语句
1.初始化、遍历
用
随机值初始化两个长度为n的数组,操作一下。
package dataStructures.array;
import static tips.Print.*;
/**
* ArrayBasic.java:
* 演示array的各种基本语法。
* @author (yqj2065)
* @version (0.1)
*/
public class ArrayBasic{
public static void opArrays(int n){
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i <n; i++) {
a[i] =(int)(n * Math.random());
b[i] =(int)(n * Math.random());
}
pln(a);pln(b);
int max =0;
for(int x: a){
if (x > max) max = x;
}
pln("max in array a = "+ max);
double sum = 0.0;
for (int x : b) {
sum += x;
}
pln("average of array b = "+ sum /n);
}
}
[4, 2, 2, 2, 3]
[0, 0, 2, 2, 4]
max in array a = 4
average of array b = 1.6
大量练习参见第11章排序。
2.大数的阶乘
以一定长度的int数组a保存阶乘得数的每一位,a[0]保存最高位,a[n-1]保存个位。
注:n!需要的位数log
10(n!) 取整加1。
package dataStructures.array;
public class Factorial4Big{
static void factorial( int n ){
int len = len(n);//n!的位数
int[] a = new int[len];
int h_digit = len-1;//最高位指针
a[h_digit] = 1;
for (int i=2;i<=n;i++){//阶乘
for (int k = h_digit; k<len; k++){//i乘以a各有效位数的元素
a[k] *= i;
}
for (int k = len-1;k>=h_digit;k--) {//进位
if (a[k]>10){
a[k-1] += a[k] / 10;
a[k] = a[k] % 10;
if (k-1<h_digit) h_digit--;
}
}
}
for (int i=h_digit; i<len; i++){//打印
System.out.print(a[i]);
}
System.out.print(" "+len);
}
// n!需要的位数。
static int len(int n){
double x = 0;
for(int i=1; i<=n; i ++) {
x += Math.log10(i);
}
return (int)Math.floor(x)+1;
}
}
50000! = 334732…0000 213237 //要运行较长时间。