java-1002 写出这个数 (20)

读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10^100^。

输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

首先,不想用java内置的Integer.parseInt方法,我们利用ASCII码和数值的对应关系,中间正好相差48

之后就是分析问题:

    第一步、求和(没有什么好说的,每次都减去偏差量就可以做到完美的进行求和了)

    第二步、求出上面和的位数(这个也好整)

    第三步、根据上面的位数来确定结果字符串(也...好整)

package PTA.basic.PrintThisNumber1002;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PrintThisNumber {
 
    public static void main(String[] args) throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String target = bufferedReader.readLine();
        System.out.println(method(target));
    }

    public static String method(String target) {
        int sum = 0;
        for (int i = 0 ; i < target.length() ; i ++)
            sum += target.charAt(i) - 48;
        StringBuffer stringBuffer = new StringBuffer();
        int digit = getDigit(sum);
        for (int i = digit - 1 ; i > 0 ; i --) {
            stringBuffer.append(getSplitResult(sum / (int) Math.pow(10, i)) + " ");
            sum %= Math.pow(10,i);
        }
        stringBuffer.append(getSplitResult(sum % 10));
        return stringBuffer.toString();
    }

    public static String getSplitResult(int i) {
        switch (i) {
            case 0:
                return "ling";
            case 1:
                return "yi";
            case 2:
                return "er";
            case 3:
                return "san";
            case 4:
                return "si";
            case 5:
                return "wu";
            case 6:
                return "liu";
            case 7:
                return "qi";
            case 8:
                return "ba";
            case 9:
                return "jiu";
        }
        return null;
    }
   
    public static int getDigit(int target) {
        for (int i = 0 ; i < 100 ; i ++) {
            if (target / (int) Math.pow(10, i) == 0)
                return i;
        }
        return -1;
    }

}

这个的时间是97ms

第二种方法就是简简单单的利用parseInt进行转换之后写了

emm第二种方法是....95ms,,,我要看看parseInt干了点什么,,,我觉得的应该我的方法比较快啊啊啊啊QAQ,第二种方法贴一下

package PTA.basic.PrintThisNumber1002;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PrintThisNumber1 {

    public static void main(String[] args) throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String target = bufferedReader.readLine();
        System.out.println(method(target));
    }

    public static String method(String target) {
        int sum = 0;
        for (int i = 0 ; i < target.length() ; i ++) {
            sum += Integer.parseInt(target.charAt(i) + "");
        }
        StringBuffer stringBuffer = new StringBuffer();
        int digit = PrintThisNumber.getDigit(sum);
        for (int i = digit - 1 ; i > 0 ; i --) {
            stringBuffer.append(PrintThisNumber.getSplitResult(sum / (int) Math.pow(10, i)) + " ");
            sum %= Math.pow(10,i);
        }
        stringBuffer.append(PrintThisNumber.getSplitResult(sum % 10));
        return stringBuffer.toString();
    }


}

真是令人不爽,,,我要看看parseInt中干了什么

猜你喜欢

转载自blog.csdn.net/jdie00/article/details/81054049