算法集合

1 写一个函数,输入int型,返回整数逆序后的字符串。

public static void main(String[] args) {
    System.out.println("开始");
    System.out.println(fun(1234587512));
    System.out.println("结束");
}
private static String fun(int arg0){
    if(arg0/10>0){
        return arg0%10+String.valueOf(fun(arg0/10));
    }else{
        return String.valueOf(arg0);
    }
}

2 把金额阿拉伯数字转换为汉字表示,小数点后四舍五入保留两位。(转载)

流程图

import java.io.*;
import java.lang.IllegalArgumentException;
public class ConvertNum{
    /**
 * 把金额阿拉伯数字转换为汉字表示,小数点后四舍五入保留两位
     * 还有一种方法可以在转换的过程中不考虑连续0的情况,然后对最终的结果进行一次遍历合并连续的零
 */
    public static String [] ChineseNum = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    public static String NumToChinese(double num){
    if(num > 99999999999999.99 || num < -99999999999999.99)
throw new IllegalArgumentException("参数值超出允许范围 (-99999999999999.99 ~ 99999999999999.99)!");
        boolean negative = false;//正负标号
        if(num<0){
            negative = true;
            num = num*(-1);
        }
        long temp = Math.round(num*100);
        int numFen=(int)(temp%10);//分
        temp=temp/10;
        int numJiao = (int)(temp%10);//角
        temp=temp/10;
        //此时temp只包含整数部分
        int [] parts =new int[20];//将金额整数部分分为在0-9999之间数的各个部分
        int numParts = 0;//记录把原来金额整数部分分割为几个部分 
        for(int i=0;;i++){
            if(temp == 0)
                break;
            int part = (int)(temp%10000);
            parts[i] =part;
            temp = temp/10000;
            numParts++;
        }
        boolean beforeWanIsZero = true;//标志位,记录万的下一级是否为0
        String chineseStr = "";
        for(int i=0;i<numParts;i++){
            String partChinese = partConvert(parts[i]);
            if(i%2==0){//前四位,第一部分
                if("".equals(partChinese))
                    beforeWanIsZero = true;
                else
                    beforeWanIsZero = false;
            }
            if(i!=0){
                if(i%2==0)//高9位,亿的部分
                    chineseStr = "亿"+chineseStr;
                else{//高5位,万的部分
                    if("".equals(partChinese)&&!beforeWanIsZero)// 如果“万”对应的 part 为 0,而“万”下面一级不为 0,则不加“万”,而加“零”
                        chineseStr = "零"+chineseStr;
                    else{
                        if(parts[i-1]<1000&&parts[i-1]>0)//如果万的部分不为0,而万前面的部分小于1000大于0,则万后面应该跟零
                            chineseStr = "零"+chineseStr;
                        chineseStr = "万"+chineseStr;
                    }
                }
            }
            chineseStr = partChinese + chineseStr;
        }
        if("".equals(chineseStr))//整数部分为0,则表示为零元
            chineseStr = ChineseNum[0];
        else if(negative)//整数部分部位0,但是为负数
            chineseStr = "负" +chineseStr;
        chineseStr = chineseStr + "元";
        if(numFen==0&&numJiao==0){
            chineseStr = chineseStr +"整";
        }
        else if(numFen==0){//0分
            chineseStr = chineseStr +ChineseNum[numJiao] + "角";
        }
        else{
            if(numJiao==0)
                chineseStr = chineseStr + "零" + ChineseNum[numFen] + "分";
else
chineseStr = chineseStr + ChineseNum[numJiao] + "角" + ChineseNum[numFen] + "分";
        }
        return chineseStr;
    }
    //转换拆分后的每个部分,0-9999之间
    public static String partConvert(int partNum){
        if(partNum<0||partNum>10000){
            throw new IllegalArgumentException("参数必须是大于等于0或小于10000的整数");
        }
        String [] units = new String[]{"","拾","佰","仟"};
        int temp = partNum;
        String partResult = new Integer(partNum).toString();
        int partResultLength = partResult.length();
        boolean lastIsZero = true;//记录上一位是否为0
        String chineseStr = "";
        for(int i=0;i<partResultLength;i++){
            if(temp == 0)//高位无数字
                break;
            int digit = temp%10;
            if(digit == 0){
                if(!lastIsZero)//如果前一个数字不是0则在当前汉字串前加零
                    chineseStr = "零"+chineseStr;
                lastIsZero = true;
            }
            else{
                chineseStr = ChineseNum[digit] + units[i] +chineseStr;
                lastIsZero = false;
            }
            temp =temp/10;
        }
        return chineseStr;  
    }
    public static void main(String args []){
            double num = 0;
            System.out.println("请输入金额数字,-1退出");
            num = getInputNum(num);
            while(num!=-1){
                System.out.println(num+NumToChinese(num));
                num = getInputNum(num);
            }
            System.out.println("其他测试:");
            System.out.println("100120: " + NumToChinese(100120));
            System.out.println("25000000000005.999: " + NumToChinese(25000000000005.999));
System.out.println("45689263.626: " + NumToChinese(45689263.626));
System.out.println("0.69457: " + NumToChinese(0.69457));
System.out.println("253.0: " + NumToChinese(253.0));
System.out.println("0: " + NumToChinese(0));
    }
    private static double getInputNum(double num) {
        try{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        num = Double.parseDouble(br.readLine());
        }catch(IOException e){
            System.out.println(e.toString());
        }
        return num;
    }
}

容易混淆的地方

需要注意的地方

6/3/2015 4:42:04 PM

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值