package com.itheima; /** * 10、 金额转换,阿拉伯数字转换成中国传统形式。 * 例如:1010 0000 1010 * 转换为 壹仟零壹拾亿零壹仟零壹拾圆整 * @author Administrator * */ public class Test10 { /** * @param args */ public static void main(String[] args) { String str = "101000001010"; convertToChineseFormat(str); } /** * 将字符串转换为中文格式 * @param str */ public static void convertToChineseFormat(String str){ if(!str.matches("\\d+")){//正则判断是不是数字 System.out.println("字符串" + str + "不是数字格式,无法转换!"); return;//不是 则返回 } while(str.startsWith("0")){ //将字符串最前面的0去掉 str = str.substring(1, str.length()); } char[] num = new char[]{'0','1','2','3','4','5','6','7','8','9'}; char[] cnNum = new char[]{'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'}; for(int i=0; i<10; i++){//将字符串数字替换成中文数字,循环对应替换 str = str.replace(num[i], cnNum[i]); } StringBuilder sb = new StringBuilder(str);//StringBuilder存放字符串,用于插入删除操作 int index = str.length()-1; //从第index个字符从后往前开始操作,操作一次,index-- //存放金额单位 String[] unit = {"","拾","佰","仟"}; String[] unit4 = {"万","亿"}; boolean flag = false;//判断前一个数是否为零的标记 for(int i=0; i<str.length(); i++){//循环体内对sb进行操作 //每4位插入万每8位插入亿,最低位先不设置单位 if(i%4 == 0 && i != 0){ //根据金额规则,单位万前面为4个零时,不插入万,并将index位置(最低位)的零删除 if((i/4-1)%2 == 0 && index >= 3 && str.substring(index-3, index+1).equals("零零零零")){ sb.deleteCharAt(index); index--; continue; } //否则在index+1位置插入相应的单位:万、亿 sb.insert(index+1, unit4[(i/4-1)%2]); } //如果4位的最低位为零,删除最低位的零,将零标志置为true if(i%4 == 0 && str.charAt(index) == '零'){ sb.deleteCharAt(index); flag = true; index--; continue; } //如果前一位为零并且这一位也为零,删除这一位的零 if(flag && str.charAt(index) == '零'){ sb.deleteCharAt(index); index--; continue; } //如果当前位为零,将零标志置为true if(str.charAt(index) == '零'){ flag = true; index--; continue; } //当前位不为零,将零标志位置为false,插入金额单位 flag = false; sb.insert(index+1, unit[i%4]); index--; } //完善金额表示形式 sb.append("圆整"); System.out.println(sb.toString()); } }
package com.itheima; import java.util.Scanner; import java.util.Stack; /** * 9、 编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数, * 然后打印出这个十进制整数对应的二进制形式。 * 这个程序要考虑输入的字符串不能转换成一个十进制整数的情况, * 并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。 * 提示:十进制数转二进制数的方式是用这个数除以2,余数就是二进制数的最低位, * 接着再用得到的商作为被除数去除以2,这次得到的余数就是次低位,如此循环, * 直到被除数为0为止。其实,只要明白了打印出一个十进制数的每一位的方式 * (不断除以10,得到的余数就分别是个位,十位,百位), * 就很容易理解十进制数转二进制数的这种方式。 * @author Administrator * */ public class Test9 { public static void main(String[] args) { //String param = "9876543210"; System.out.println("请输入要转换的字符串:"); Scanner input=new Scanner(System.in); String str=input.next(); Integer num = 0; Stack<Integer> stack = new Stack<Integer>();//这里用栈存储方式比较合适 try { num = Integer.valueOf(str);//将字符串变为Inetger类型 -2的31次方 到 2的31次方-1 之间,否则出现异常,处理结果为数字太多 while (num > 0) { int b = num % 2;//得到余数 stack.add(b);//添加到stack中。 num=num/2; } toBinary(stack);//保存到stack中,余数先进后出 } catch (Exception e) { boolean flag = false;//定义标识 for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c < 48 || c > 57) {//不是0-9的數字 flag = true; break; } } if (flag) { System.out.println("存在非数字字符。"); } else { e.printStackTrace(); System.out.println("数字太大。"); } } } public static void toBinary(Stack<Integer> stack) { StringBuffer sb = new StringBuffer(); while (!stack.empty()) { sb.append(stack.pop());//出栈,同时删除,添加到StringBuffer对象中。 } System.out.println("装换后的二进制为:"+ sb.toString()); } }
package com.itheima; /** * 4、 请说明Java中字符'\'的含义,有什么作用? * @author Administrator * */ public class Test4 { public static void main(String[] args) { // '\'表示转义符号 //它和紧跟着它的那个字符构成转义字符,如“\n”(表示换行)、“\””(表示字符‘”’)等,所以在字符串中要表示字符'\'要用“\\”来表示。 //转义字符的意义就是避免出现二义性,二义性是所有编程语言都不允许的。 //例如这里打印 "A" System.out.println("\"A\""); //例如这里输入一个制表符 System.out.println("你好\t我很好"); /* 和其他符号搭配可以构成转义字符 \b 退格键 \f 换页 \n 换行 \r 回车 \t 制表符 \\ 反斜线 */ } }
package com.itheima; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; /** * 7、 定义一个文件输入流,调用read(byte[] b) 方法将exercise.txt文件中的 所有内容打印出来(byte数组的大小限制为5)。 * * @author Administrator * */ public class Test7 { public static void main(String[] args) { InputStream input = null;// 准备一个字节输入流对象 try { input = new FileInputStream("src\\com\\itheima\\exercise.txt");// 实例一个输入流对象 OutputStream out = System.out;// 得到输出流对象,控制台 byte[] b = new byte[5];// 定义缓冲数组 int len = 0;// 读取的字节数 try { while ((len = input.read(b)) != -1) { out.write(b, 0, len);// 写入到流中,控制台 } } catch (FileNotFoundException e) { System.out.println("文件不存在"); } } catch (IOException e) { System.out.println("文件读取失败"); } finally { try { input.close(); } catch (IOException e) { System.out.println("关闭输入流失败"); } } } }
package com.itheima; /** * 8、 将字符串中进行反转。abcde --> edcba * * @author Administrator * */ public class Test8 { public static void main(String[] args) { String str = reverseString("abcde");// 接受反转的字符串 System.out.println(str);// 打印输出 } /** * 反转字符串的方法 * * @param str * @return */ public static String reverseString(String str) { char[] chs = str.toCharArray();// 将字符串变为字符数组 // 循环遍历,开始指针自加,末尾指针自减 for (int start = 0, end = chs.length - 1; start < end; start++, end--) { // 交换位置 char temp = chs[start]; chs[start] = chs[end]; chs[end] = temp; } return new String(chs);// 重新把数组变为字符串 } }
package com.itheima; import java.util.Arrays; import java.util.Scanner; public class Test10 { /** * 10、 有100个人围成一个圈,从1开始报数, 报到14的这个人就要退出。 然后其他人重新开始, * 从1报数,到14退出。问:最后剩下的是100人中的第几个人? */ private static int count = 0;// 定义出局的编号,默认从0开始 public static void main(String[] args) { Scanner scanner = new Scanner(System.in);// 键盘录入 System.out.println("请输入人数:"); int totalPerson = scanner.nextInt();// 总人数 System.out.println("请输入第几个人要退出:"); int outNum = scanner.nextInt();// 第几个人要退出。 judgePerson(totalPerson, outNum);// 调用判断人数的方法 } /** * 对人数进行判断 * * @param totalPerson * @param outNum */ private static void judgePerson(int totalPerson, int outNum) { if (totalPerson == 1) {// 如果总人数是1,退出的就是这个人。 System.out.println("最后剩下的人为" + totalPerson + "个"); } else {// 否则调用退出的方法 personExit(totalPerson, outNum); } } /** * 退出方法 * * @param totalPerson * 总人数 * @param outNum * 第几个人要退出 */ private static void personExit(int totalPerson, int outNum) { int[] arr = new int[totalPerson];// 实例一个数组,长度为总人数 for (int j = 0; j < totalPerson; j++) {// 循环遍历 for (int i = 0; i < outNum; i++) { count++;// 每数一个人,则编号加1 if (j > 0) {// 这里j>0可以不用判断,因为上面已经判断过了。 measure(j, arr);// 调用判断count是否存在的方法 } if (count > totalPerson) { count = 1;// 若count大于总人重新赋值为1 measure(j, arr);// 调用判断count是否存在的方法。 } } arr[j] = count;// 将退出的人保存到数组中. } System.out.println("退出的顺序为:" + Arrays.toString(arr)); System.out.println("最后剩下的人为:" + arr[totalPerson - 1]);// 最后剩下的人 } /** * 判断count是不是存在 * * @param n * @param arr */ private static void measure(int n, int[] arr) { // 双重循环判断,因为要保证count的唯一。 for (int s = 0; s < n; s++) { for (int w = 0; w < n; w++) { if (count == arr[w]) count++;// 若存在则加1. } } } }