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.
}
}
}
}