《疯狂Java讲义(第4版)》-----第4章【习题解答】

【练习1】九九乘法表


public class Multiplication_table {

	public static void main(String[]args){
		for(int i=1;i<=9;i++){
			for(int j=1;j<=i;j++){				
				System.out.print(i+"X"+j+"="+(i*j));
				if(j!=i) System.out.print(",");
			}
			System.out.println();
		}
	}
}

【练习2】打印由"*"生成的等腰三角形

import java.util.Scanner;

public class test {
	
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n-i;j++) System.out.print(" ");
			for(int j=1;j<=2*i-1;j++) System.out.print("*");
			System.out.println();
		}
	}
}

【练习3】用“*”打印一个圆

//本程序依据x^2+y^2=r^2这个圆公式进行画圆
import java.util.Scanner;
import java.lang.Math;

public class test{
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		double r=scan.nextDouble();
		for(double x=-r;x<=r;x+=2){	//此处i+=2,可以控制好更像圆,如果i++像椭圆
			double y=Math.sqrt(Math.pow(r, 2)-Math.pow(x, 2));
			for(double i=-r;i<=r;i++){
				//对于x坐标,遍历一边-r到r所有值,如果和y坐标之差的绝对值在0.5的误差范围内,我们就认为此处i=y,应该大衣呢出点
				System.out.print((Math.abs(y-i)<=0.5 || Math.abs(-y-i)<=0.5)?'*':' ');
			}
			System.out.println();
		}
	}
}

输入输出样例:
这里写图片描述

【练习4】通过字节截取实现String的substring方法

方案一

看了网上的各类版本,都没有实现题目要求,下面代码可以实现题目要求,实现和String的substring完全一样的功能。

在eclipse下编译运行,输出结果是错误的,可以用命令行进行编译运行。主要是因为汉字编码问题。eclipse默认GBK编码,而汉字是Unicode编码。



public class test{
	public static void main(String[] args){
		System.out.println(substring("中国China",1,3));
	}
	
	//按照字节截取字符串实现和String的substring完全一样的功能
	public static String substring(String str,int indexStart,int indexEnd){
		byte[] bt=str.getBytes();
		int[] cnt=new int[bt.length];
		
		int num=0;
		//标记每个字节对应原字符串中字符的下标
		for(int i=0;i<bt.length;i++){
			cnt[i]=num;
			if(bt[i]<0){
				cnt[i+1]=num;
				i++;
			}
			num++;
		}
		
		int st=0,en=0;
		//寻找原来以indexStart为下标的字符在bt字节数组中开始的字节下标
		for(int i=0;i<bt.length;i++){
			if(cnt[i]==indexStart){
				st=i;
				break;
			}
		}
		//寻找原来以indexEnd为下标的字符在bt字节数组中结束的字节下标
		for(int i=bt.length-1;i>=0;i--){
			if(cnt[i]==indexEnd-1){
				en=i;
				break;
			}
		}
		
		return new String(bt,st,en-st+1);//使用String的构造函数String​(byte[] bytes, int offset, int length)
	}
}

输出:
国C

方案二(主要代码)

String str = "中国abc";
byte[] by = str.getBytes();

byte[] dst = Arrays.copyOfRange(by,2,5);
System.out.println(new String(dst));

【练习5】输入一个浮点数,给出相应的人民币读法。

下面程序输入要求:整数部分8位及以内,小数部分2位及以内。

package assignment;

import java.util.Scanner;

/*
 本程序实现整数部分8位及以内,小数部分2位及以内的浮点数用人民币读法表示
 比如230432.25表示为贰拾叁万零肆佰叁拾贰元贰角伍分
 
 算法思路:核心思想是解决四位数16种情况的每种人民币读法,这里说的四位数允许有前导0,
再按照前导0读与不读分为两种情况,故相当于共32种情况,解决好这32种情况,核心问题
已经解决!进一步,如果整数部分小于等于9999,则按照不读0的方法转换成人民币读法,如
果整数部分大于等于10000,则低四位按照读0,高四位按照不读0的方法转换成人民币高读法。
 */

public class test{
	public final static String HAN="零壹贰叁肆伍陆柒捌玖拾";
	public final static String UNIT="十百千";
	
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		System.out.println("请输入一个浮点数: ");
		String s=scan.next();
		System.out.println("这个浮点数转换成人民币读为: ");
		
		
		solve(s);
	}
	
	
	
	//四位数读0的情况,不足四位补0补够四位,形参一定是长度为4的字符串,不足四位,用前导0先补齐再作为形参
	public static String read_0(String s){
		char a=s.charAt(0);
		char b=s.charAt(1);
		char c=s.charAt(2);
		char d=s.charAt(3);
		if(s.equals("0000")) return "";//0000
		else if(a=='0' && b=='0' && c=='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(d-'0');//0001
		else if(a=='0' && b=='0' && c!='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(c-'0')+UNIT.charAt(0);//0010
		else if(a=='0' && b=='0' && c!='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0011
		else if(a=='0' && b!='0' && c=='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1);//0100
		else if(a=='0' && b!='0' && c=='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//0101
		else if(a=='0' && b!='0' && c!='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//0110
		else if(a=='0' && b!='0' && c!='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0111
		else if(a!='0' && b=='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2);//1000
		else if(a!='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(d-'0');//1001
		else if(a!='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0);//1010
		else if(a!='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1011
		else if(a!='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1);//1100
		else if(a!='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//1101
		else if(a!='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//1110
		else if(a!='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1111
		else return "Error!!!";//不是上述16种情况则返回错误信息
	}
	
	//四位数不读0的情况,不足四位补0补够四位,形参一定是长度为4的字符串,不足四位,用前导0先补齐再作为形参
	public static String not_read_0(String s){
		char a=s.charAt(0);
		char b=s.charAt(1);
		char c=s.charAt(2);
		char d=s.charAt(3);
		if(s.equals("0000")) return ""+HAN.charAt(0);//0000
		else if(a=='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(d-'0');//0001
		else if(a=='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(c-'0')+UNIT.charAt(0);//0010
		else if(a=='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0011
		else if(a=='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1);//0100
		else if(a=='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//0101
		else if(a=='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//0110
		else if(a=='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0111
		else if(a!='0' && b=='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2);//1000
		else if(a!='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(d-'0');//1001
		else if(a!='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0);//1010
		else if(a!='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1011
		else if(a!='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1);//1100
		else if(a!='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//1101
		else if(a!='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//1110
		else if(a!='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//1111
		else return "Error!!!";//不是上述16种情况则返回错误信息
	}
	
	//小数部分处理,小数最多两位,不足则补足两位,直接类似上面分情况傻瓜便捷式分类
	public static String read_decimal(String s){
		char a=s.charAt(0);
		char b=s.charAt(1);
		return HAN.charAt(a-'0')+"角"+HAN.charAt(b-'0')+"分";
	}
	
	//把浮点数劈出整数部分
	public static String split_to_integer(String s){
		int mark=s.length();//标记小数点位置
		String integer="";
		
		//寻找小数点位置
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='.'){
				mark=i;
				break;
			}
		}
		
		
		//分离出整数部分赋给integer
		for(int i=0;i<mark;i++){
			integer+=s.charAt(i);
		}
		
		return integer;
	}
	
	//把浮点数劈出小数部分
	public static String split_to_decimal(String s){
		int mark=s.length();//标记小数点位置
		String decimal="";
		//寻找小数点位置
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='.'){
				mark=i;
				break;
			}
		}
		
		//分离出小数部分给decimal
		for(int i=mark+1;i<s.length();i++){
			decimal+=s.charAt(i);
		}
		
		//小数部分规范化为2位
		if(decimal.length()==0) decimal="00";
		else if(decimal.length()==1) decimal+='0';
		
		return decimal;
	}
	
	//获取整数高四位
	public static String get_high_4(String s){
		String high_4="";
		if(s.length()<=4) return "";
		else{
			for(int i=0;i<s.length()-4;i++){
				high_4+=s.charAt(i);
			}
			
			
			//高四位不足4位补足4位
			int len=high_4.length();//一定要加上这一句,下面i的范围不能直接用high_4.length(),因为这是变的
			for(int i=0;i<4-len;i++){
				high_4='0'+high_4;
			}
			
			return high_4;
		}
	}
	
	//获取整数低四位
	public static String get_low_4(String s){
		String low_4="";
		if(s.length()>=4){
			for(int i=s.length()-4;i<s.length();i++)
				low_4+=s.charAt(i);
		}
		else{
			for(int i=0;i<s.length();i++)
				low_4+=s.charAt(i);
			
			for(int i=0;i<4-s.length();i++)
				low_4='0'+low_4;
		}
		return low_4;
	}

	
	
	//解决本问题,读出人民币汉语来
	public static void solve(String s){
		String integer="",high_4="",low_4="",decimal="",read_high_4="",read_low_4="",read_decim="";
	
		integer=split_to_integer(s);	//System.out.println(integer);
		decimal=split_to_decimal(s);
		read_decim=read_decimal(decimal);
		low_4=get_low_4(integer);	//System.out.println(low_4);
		high_4=get_high_4(integer);	//System.out.println(high_4);
		
		if(high_4.equals("")){
			read_low_4=not_read_0(low_4);	
			System.out.println(read_low_4+"元"+read_decim);
		}
		else{
			read_low_4=read_0(low_4);
			read_high_4=not_read_0(high_4); 
			System.out.println(read_high_4+"万"+read_low_4+"元"+read_decim);
		}
	}
}
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值