首页 > 代码库 > 第七讲课后

第七讲课后

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 }
View Code

 

技术分享

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 }
View Code

 

技术分享

 

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 }
View Code

 

技术分享

 

第七讲课后