一.随机数组
1.设计思路
·定义一个方法,累加求和数组,用递归的方法;主方法中首先创建长度为10的数组,初始化输出变量output,遍历数组,随机生成1~100的数赋值,output进行记录,以对话框的形式输出output,即数组的内容,利用方法leijia,求出已有数组的和result,以对话框的形式输出result。
2.程序流程图
3.源代码
//长度为10随机数组(1~100),并求和
//wangfan 20161101
import javax.swing.JOptionPane;
public class Randomarray {
public static void main(String args[]){
int[] a=new int[10];//创建长度为10的数组
String output="";//初始化输出output
//长度为10随机数组(1~100)
for(int i=0;i<a.length;i++){
a[i]=(int)(Math.random()*100+1);
output+=a[i]+" ";
}
//对话框的形式输出数组
JOptionPane.showMessageDialog(
null, output, "1~100的长度为10的随机数组",
JOptionPane.INFORMATION_MESSAGE );
//求和
int result = leijia(a, a.length);
//对话框输出求和结果
JOptionPane.showMessageDialog(
null, result, "该随机数组的和",
JOptionPane.INFORMATION_MESSAGE );
}
public static int leijia(int b[], int size) {
if (size == 1)
return b[0];
else
return b[size - 1] + leijia(b, size - 1);
}
}
4. 结果截图
5.编程总结
·数组求累加和,可以利用递归,数组长度为限制条件,从数组最后的数开始遍历,累加,当数组长度为1,返回最后一个数,得到最后的结果就是累加和。
二.动手动脑
1.请看以下代码:
上述代码可以顺利通过编译,并且输出一个“很奇怪”的结果:[Ljava.lang.Object;@2a139a55
2.数组元素为引用类型,如何给某一个对象赋值?
·以Student为例
public static void main(String args[])
{
Student[] stu=new Student[100];
for(int i=0;i<stu.length;i++)
{
stu[i]=new Student();
}
}
class Student
{
String name;
int age;
boolean sex;
double score;
}
3.阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照。
·使用引用传递,如果方法中有代码更改了数组元素的值,实际上是直接修改了原始的数组元素。
·使用安值传送,方法体中修改的仅是原始数组元素的一个拷贝。
4.以下代码的输出结果是什么?为什么会有这个结果?
int[] a = {5, 7 , 20};
int[] b = new int[4];
System.out.println("b数组的长度为:" + b.length);
b = a;
System.out.println("b数组的长度为:" + b.length);
测试用代码:ArrayInRam.java
·开始数组b是开辟了长度为4的储存空间,所以b数组的初始长度为:4,后来将a赋值b,a和b其实指的是同一个储存空间,即数组a的储存空间,所以长度变为3。
5.请编写一个程序将一个整数转换为汉字读法字符串。比如“1123”转换为“一千一百二十三”。
import java.util.Scanner;
public class Hanzhuanhua {
public static void main(String args[]){
String handu[]={"","十","百","千","万","十万","百万","千万"};
String hanbiao[]={"","拾","佰","仟","万","拾万","佰万","仟万"};
String hanshu[]={"零","一","二","三","四","五","六","七","八","九"};
String hanss[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
String output="";
String output1="";
System.out.println("输入一个整数");
Scanner scanner=new Scanner(System.in);
String number=scanner.next();
int length=number.length();
for(int i=0;i<length;i++)
{
int num=number.charAt(i)-48;
if(i!=length-1&&num!=0)
output+=hanshu[num]+handu[length-1-i];
else
{
if(output.length()>0 && hanshu[num].equals("零") && output.charAt(output.length()-1)=='零')
continue;
output += hanshu[num];
}
}
if(output.length()==1)
System.out.println(output);
//去除末尾零
int index=output.length()-1;
while(output.charAt(index)=='零')
index--;
if(index!=output.length()-1)
System.out.println(output.substring(0,index+1));
else
{
System.out.println(output);
}
System.out.println("金钱数额");
Scanner scan=new Scanner(System.in);
String money=scan.next();
int judge=panduan(money);
int len=money.length();
if(judge==0)
{
for(int j=0;j<len;j++)
{
int n=money.charAt(j)-48;
if(j!=length-1&&n!=0)
output1+=hanss[n]+hanbiao[length-j-1];
else
{
if(output1.length()>0 && hanss[n].equals("零") && output1.charAt(output1.length()-1)=='零')
continue;
output1 += hanss[n];
}
}
if(output1.length()==1)
System.out.println(output1+"元");
//去除末尾零
int ind=output1.length()-1;
while(output1.charAt(ind)=='零')
ind--;
if(ind!=output1.length()-1)
System.out.println(output1.substring(0,ind+1)+"元");
else
{
System.out.println(output1+"元");
}
}
else
{
for(int j=0;j<judge;j++)
{
int n=money.charAt(j)-48;
if(j!=length-1&&n!=0)
output1+=hanss[n]+hanbiao[length-j-1];
else
{
if(output1.length()>0 && hanss[n].equals("零") && output1.charAt(output1.length()-1)=='零')
continue;
output1 += hanss[n];
}
}
if(output1.length()==1)
output1=output1+"元";
//去除末尾零
int ind=output1.length()-1;
while(output1.charAt(ind)=='零')
ind--;
if(ind!=output1.length()-1)
output1=output1.substring(0,ind+1)+"元";
else
{
output1=output1+"元";
}
if(money.length()-judge-1==2)
{
int z=judge+1;
int m=money.charAt(z)-48;
if(m!=0)
output1+=hanss[m]+"角";
else
output1=output1;
int k=money.charAt(z+1)-48;
output1+="零"+hanss[k]+"分";
}
else
{
int v=judge+1;
int c=money.charAt(v)-48;
output1+=hanss[c]+"角";
}
System.out.println(output1);
}
}
public static int panduan(String str)
{
int len=str.length();
for(int j=0;j<len;j++)
if(str.charAt(j)=='.')
return j;
return 0;
}
}
6.前面几讲介绍过JDK所提供的BigInteger能完成大数计算,如果不用它,直接使用数组表达大数,你能实现相同的功能吗?
要求:
(1)用你的大数类实现加和减两个功能
(2)阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的?
(3)通过互联网查找大数运算的相关资料,给你的大数类添加乘、除、求阶乘等其它功能。
import java.util.Scanner;
public class Bignum{
public static void main(String[]args){
int a[]=new int[50];
int b[]=new int[50];
int m=0;
int n=0;
int s=0;
int t=0;int w=0;
Scanner in=new Scanner(System.in);
System.out.println("请输入第一个大数:");
String aa=in.next();
System.out.println("请输入第二个大数:");
String bb=in.next();
m=a.length-aa.length();
n=b.length-bb.length();
if(aa.length()>bb.length())
{
w=1;
}
else if (aa.length()<bb.length())
{
w=-1;
}
else
w = aa.compareTo(bb);
for (int i = 0; i < aa.length(); i++)
{
a[m++] = aa.charAt(i) - 48;
}
for (int j = 0; j < bb.length(); j++)
{
b[n++] = bb.charAt(j) - 48;
}
int[] c = Bignum.add(a, b);
for (int k = 0; k < c.length; k++)
{
if (c[k] > 0)
{
s = k;
break;
}
}
System.out.print("大数相加的结果为:");
for (int i = s; i < c.length; i++)
System.out.print(c[i]);
System.out.println();
int[] d = Bignum.sub(a, b, w);
for (int k = 0; k < d.length; k++)
{
if (d[k] > 0)
{
t = k;
break;
}
}
System.out.print("大数相减的结果为:");
if (w < 0)
System.out.println("-");
for (int i = t; i < d.length; i++)
System.out.print(d[i]);
}
public static int[] add(int []a,int []b){
int digit=0;
int[]c=new int[a.length];
for(int i=a.length-1;i>=0;i--)
{
c[i]=a[i]+b[i]+digit;
if(c[i]<10)
digit=0;
else
{
c[i]=c[i]-10;
digit=1;
}
}
return c;
}
public static int[] sub(int []a,int[]b,int w)
{
int digit=0;
int[]c=new int[a.length];
for(int i=a.length-1;i>=0;i--)
{
if(w<=0)
{
c[i]=b[i]-a[i]-digit;
if(c[i]>=0)
digit=0;
else
{
c[i]=c[i]+10;
digit=1;
}
}
else
{
c[i]=a[i]-b[i]-digit;
if(c[i]>=0)
digit=0;
else
{
c[i]=c[i]+10;
digit=1;
}
}
}
return c;
}
}