作为程序员,思维要缜密,对于技术人员,创造只是一小部分,大部分还是要脚踏实地。
所以每个问题一定要想到各种情况,测试人员可能会用你想不到的数据进行测试。
练习1:计算某数的阶乘!
package com.ljl;
public class Factorial {
public static void main(String[] args)
{
try{
int num = Integer.parseInt(args[0]);
if(num < 0)
{
System.out.println("please input positive number!");
System.exit(0);
}
if(num > 170)
{
System.out.println("this program can't calculate this num!");
System.exit(0);
}
double result = 1d;
for(int i = 2; i <= num; i++)
{
result *= i;
}
System.out.println("The factorial of " + num + " is " + result);
}
catch(Exception ex)
{
if(ex instanceof ArrayIndexOutOfBoundsException)
{
System.out.println("Please input the num to calculate!");
System.exit(0);
}
if(ex instanceof NumberFormatException)
{
System.out.println("Please input a number!");
System.exit(0);
}
System.out.println("error occured!please run it again!");
System.exit(0);
}
}
}
那么对于数据输入的合法性判断,对于数据是否合理,对于程序是否能够计算所有的数,有无上界。
记住,即使不能计算,也要告诉用户,决不能给用户提供错误的答案!!
result 类型如果为int只能算到12,如果为long能算到20,如果为float只能算到32,如果为double,则可以算到170。
为什么double和long同占用8个字节,为什么表示数的范围差那么多?因为double类型支持科学计算法。
The factorial of 170 is 7.257415615307994E306
所以可能用指数方式来表达大数。
那么如果表示170以后的数的阶乘呢?可以猜用类,也可以找两个变量,一个存底数,一个存指数。
=================================
数组
int[] mark = new int[10];40字节存储空间。
-----------------------
对于局部变量,需要初始个值。
而局部变量的数组,不需要初值,会根据类型给定相应默认值。数值为0/0.0,布尔false,对象null,char /u0000
----------------------
mark 是一个int[]数组类型的对象,它保存的是那40字节存储空间的首地址。
Java中,引用和地址都保存在栈中,而具体的值开辟的空间存储在堆中。
System.arraycopy(a,0,b,0,a.length);
int[] a = {1,2,3,4,5}
int[] b = new int[10];
a.length
数组特点
1.不可变长
2.可以保存简单类型数据
3.查找快,插入和删除效率低。
2维数组
int[][] a = {{1,2},{3,4},{5,6}};
int[][] a = new int[3][];
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[1];
a类型?是一个对象,但是是虚拟机级别对象,无法用getClass().getName()显示。
哥德巴赫猜想
package com.ljl;
public class Goldbach {
public static void main(String[] args)
{
int num = Integer.parseInt(args[0]);
if(num < 6)
{
System.out.println("the num must larger than six!");
System.exit(0);
}
if(num%2 != 0)
{
System.out.println("it should be a even!");
System.exit(0);
}
for(int i = 1; i <= num/2; i++)
{
if(isZhiShu(i)&&isZhiShu(num-i)){
System.out.println(num + "=" + i + "+" + (num-i));
break;
}
}
}
private static boolean isZhiShu(int num)
{
for(int i = 2; i <= (int)Math.sqrt(num); i++)
{
if(num%i == 0)
return false;
}
return true;
}
}
posted on 2005-11-25 23:35
北国狼人的BloG 阅读(302)
评论(0) 编辑 收藏 所属分类:
达内学习总结