第七讲课后
Posted L.P.B_Blizzard
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七讲课后相关的知识,希望对你有一定的参考价值。
1.阅读QiPan.java示例程序了解如何利用二维数组和循环语句绘制五子棋盘。
他利用每次改变二维数组的值+每次改变棋盘
2.请编写一个程序将一个整数转换为汉字读法字符串。比如“1123”转换为“一千一百二十三”。更进一步,能否将数字表示的金额改为“汉字表达? 比如将“¥123.52”转换为“壹佰贰拾叁元伍角贰分”。
1 package 七讲课后习题; 2 /***@吕鹏博 3 * 时间 2016年11月5日21:35:18 4 */ 5 import java.math.BigDecimal; 6 7 import javax.swing.JOptionPane; 8 9 public class TransformNum { 10 11 private static final String[] CN_NUMBER = { "零", "壹", "贰", "叁", "肆", 12 "伍", "陆", "柒", "捌", "玖" }; 13 14 private static final String[] CN_MONETRAY_UNIT = { "分", "角", "元", 15 "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", 16 "佰", "仟" }; 17 //特殊字符:整 18 private static final String CN_FULL = "整"; 19 //特殊字符:负 20 private static final String CN_NEGATIVE = "负"; 21 22 //特殊字符:零元整 23 private static final String CN_ZEOR_FULL = "零元" + CN_FULL; 24 public static String numberTraCNMontrayUnit(double numberOfMoney) { 25 StringBuffer sb = new StringBuffer(); 26 // -1 or 1 27 double signum = Math.signum(numberOfMoney); 28 // 零元整的情况 29 if (signum == 0) { 30 return CN_ZEOR_FULL; 31 } 32 33 // 得到小数点后两位值 34 long scale = (long) (numberOfMoney % 100); 35 int numUnit = 0; 36 int numIndex = 0; 37 boolean getZero = false; 38 // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11 39 if (!(scale > 0)) { 40 numIndex = 2; 41 numberOfMoney = numberOfMoney / 100; 42 getZero = true; 43 } 44 if ((scale > 0) && (!(scale % 10 > 0))) { 45 numIndex = 1; 46 numberOfMoney = numberOfMoney / 10; 47 getZero = true; 48 } 49 int zeroSize = 0; 50 while (true) { 51 if (numberOfMoney <= 0) { 52 break; 53 } 54 // 每次获取到最后一个数 55 numUnit = (int) (numberOfMoney % 10); 56 if (numUnit > 0) { 57 if ((numIndex == 9) && (zeroSize >= 3)) { 58 sb.insert(0, CN_MONETRAY_UNIT[6]); 59 } 60 if ((numIndex == 13) && (zeroSize >= 3)) { 61 sb.insert(0, CN_MONETRAY_UNIT[10]); 62 } 63 sb.insert(0, CN_MONETRAY_UNIT[numIndex]); 64 sb.insert(0, CN_NUMBER[numUnit]); 65 getZero = false; 66 zeroSize = 0; 67 } else { 68 ++zeroSize; 69 if (!(getZero)) { 70 sb.insert(0, CN_NUMBER[numUnit]); 71 } 72 if (numIndex == 2) { 73 if (numberOfMoney > 0) { 74 sb.insert(0, CN_MONETRAY_UNIT[numIndex]); 75 } 76 } else if (((numIndex - 2) % 4 == 0) && (numberOfMoney % 1000 > 0)) { 77 sb.insert(0, CN_MONETRAY_UNIT[numIndex]); 78 } 79 getZero = true; 80 } 81 // 让number每次都去掉最后一个数 82 numberOfMoney = numberOfMoney / 10; 83 ++numIndex; 84 } 85 // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负 86 if (signum == -1) { 87 sb.insert(0, CN_NEGATIVE); 88 } 89 // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整 90 if (!(scale > 0)) { 91 sb.append(CN_FULL); 92 } 93 return sb.toString(); 94 } 95 96 public static void main(String[] args) { 97 String mone=JOptionPane.showInputDialog("请输入要转换的金额:"); 98 double money=Double.parseDouble(mone); 99 BigDecimal numberOfMoney = new BigDecimal(money); 100 String s = New.numberTraCNMontrayUnit(numberOfMoney); 101 String output="你输入的金额为:【"+ money +"】 " 102 + "[" +s.toString()+"]"; 103 JOptionPane.showMessageDialog(null, output, 104 "结果如下:", 105 JOptionPane.INFORMATION_MESSAGE ); 106 } 107 }
3.前面几讲介绍过JDK所提供的BigInteger能完成大数计算,如果不用它,直接使用数组表达大数,你能实现相同的功能吗?
要求:
(1)用你的大数类实现加和减两个功能
(2)阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的?
(3)通过互联网查找大数运算的相关资料,给你的大数类添加乘、除、求阶乘等其它功能。
我的代码(只能实现加减):
1 package 七讲课后习题; 2 import java.util.Scanner; 3 /*** 4 * 5 * @author 吕鹏博 6 *2016年11月6日18:16:50 7 */ 8 public class S1{ 9 public static int[]add(int []a,int []b){ 10 int digit=0;//位数 11 int[]c=new int[a.length]; 12 for(int i=a.length-1;i>=0;i--) 13 { 14 c[i]=a[i]+b[i]+digit; 15 if(c[i]<10) 16 digit=0; 17 else 18 { 19 c[i]=c[i]-10; 20 digit=1; 21 } 22 } 23 return c; 24 } 25 public static int []sub(int []a,int[]b,int w) 26 { 27 int digit=0; 28 int[]c=new int[a.length]; 29 for(int i=a.length-1;i>=0;i--) 30 { 31 if(w<=0) 32 { 33 c[i]=b[i]-a[i]-digit; 34 if(c[i]>=0) 35 { digit=0;} 36 else 37 { 38 c[i]=c[i]+10; 39 digit=1; 40 } 41 } 42 else 43 { 44 c[i]=a[i]-b[i]-digit; 45 if(c[i]>=0) 46 {digit=0;} 47 else 48 { 49 c[i]=c[i]+10; 50 digit=1; 51 } 52 } 53 } 54 return c; 55 } 56 public static void main(String[]args){ 57 int a[]=new int[50]; 58 int b[]=new int[50]; 59 int m=0; 60 int n=0; 61 int s=0; 62 int t=0;int w=0; 63 Scanner in=new Scanner(System.in); 64 System.out.println("请输入第一个大数:"); 65 String aa=in.next(); 66 System.out.println("请输入第二个大数:"); 67 String bb=in.next(); 68 m=a.length-aa.length(); 69 n=b.length-bb.length(); 70 if(aa.length()>bb.length()) 71 { 72 w=1; 73 } 74 else if (aa.length()<bb.length()) 75 { 76 w=-1; 77 } 78 else 79 {w = aa.compareTo(bb);} 80 for (int i = 0; i < aa.length(); i++) 81 { 82 a[m++] = aa.charAt(i) - 48; 83 } 84 for (int j = 0; j < bb.length(); j++) 85 { 86 b[n++] = bb.charAt(j) - 48; 87 } 88 int[] c = S1.add(a, b); 89 for (int k = 0; k < c.length; k++) 90 { 91 if (c[k] > 0) 92 { 93 s = k; 94 break; 95 } 96 } 97 System.out.print("大数相加的结果为:"); 98 for (int i = s; i < c.length; i++) { 99 System.out.print(c[i]); 100 } 101 System.out.println(); 102 int[] d =S1.sub(a, b, w); 103 for (int k = 0; k < d.length; k++) 104 { 105 if (d[k] > 0) 106 { 107 t = k; 108 break; 109 } 110 } 111 System.out.print("大数相减的结果为:"); 112 if (w < 0) 113 System.out.print("-"); 114 for (int i = t; i < d.length; i++) 115 { 116 System.out.print(d[i]); 117 } 118 System.out.println(); 119 System.out.println(); 120 System.out.println(); 121 System.out.println(); 122 } 123 }
4.随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中。
1 package 七讲课后习题; 2 /**@吕鹏博 3 * 时间 2016年11月5日21:34:34 4 */ 5 import javax.swing.JOptionPane; 6 public class Shuzu { 7 8 public static void main(String[] args) { 9 double[] example=new double[10]; 10 for(int i=0;i<10;i++) 11 { 12 example[i]=(int)(1+Math.random()*(10-1+1)); 13 14 } 15 String output="生成的随机数为:\\n"; 16 for(int j=0;j<10;j++) 17 { 18 output+=example[j]+" "; 19 if(j==4) 20 output+="\\n"; 21 } 22 double sum=0; 23 for(int j=0;j<10;j++) 24 { 25 sum+=example[j]; 26 27 } 28 output+="\\n总和为"+sum; 29 JOptionPane.showMessageDialog(null, output); 30 31 } 32 33 }
以上是关于第七讲课后的主要内容,如果未能解决你的问题,请参考以下文章