blog

数字のアラビア数字を相互に変換する

[TOC]\n\n\n\n\n問題解決のためのアイデア\n\n\n上の3つの数字を求めなさい。それぞれ1億、70,719,000、71,977です。この3つの数字を下に訳してください。\n3つの数字を...

Feb 21, 2020 · 7 min. read
シェア

[TOC]

  • 上の3つの数字を出してください。それぞれ1億、70,719,000、7,197,000です。この3つの数字の訳を以下に示します。

それぞれ壊れ

  • 3つの数字をそれぞれ変換したら、あとは組み合わせるだけです。組み合わせで問題になるのは、ゼロを加えたり取り除いたりする中間演算でもあります。

10億 1
7,700万7,900,000人 779人。 7079
七千百九十七 sevenoneninetyseven 9177

    フレンドリーなリマインダー

    • 上記の数字は非常にうまく訳せています。しかし、物事が常に計画通りに進まない、この別のカテゴリーの数字があります。
    • 1億7,900万1,997ドル === 001790197
    • 上記のような理屈があるでしょう。
    10億 1
    7,700万7,900,000人 ゼロ7ナイン 970
    970 ゼロイチセブン 9107
    • 正しいスプライシング・スキームは +079)*10000+0197=001790197 です。

    • 100790197 == 100,790,197,000,000

    • 100000197==10197万

    • 上の2つのアラビア数字は解析され、以下のように変換されます。ここでもまた、高位で分離されます。ここで重要なのは、分離は低い方から高い方へ行う必要があるということです。

      • 0との出会い
      • 0との最初の遭遇
      • すべてのゼロが一様に高いセルの後ろにあるわけではありません。
    • 上記の3つを簡単に説明してください。まず1つ目は、国の制度です。2つ目は実は保険点数。使い捨てにできます。ゼロに遭遇した後の最も重要な3番目のポイントは、すべての0が続くことはできません。

    • つまり、上記の0079はゼロ79となります。

    • つまり、次のようになります。

    1
    7009 7,700万7,900,000人
    9107 970
    • つまり、1,007,901,997=1,079,190,197百万円。
    1
    0000
    9107 970

    テスト

    
    Integer right = 0;
    Integer total = 10000000;
    List<Map<String, Object>> list = new ArrayList<>();
    for (int i = 0; i < total; i++) {
     Integer number = MathUtil.getInstance().getRandom(1, 1000000000);
     //System.out.println(i);
     //Integer number = 400001989;
     String chinese = DigitUtil.getInstance().getNumberFromAlabo(number.toString());
     String alabo = DigitUtil.getInstance().getNumberFromChinese(chinese);
     boolean equals = alabo.equals(number.toString());
     if (equals) {
     right++;
     } else {
     Map<String, Object> map = new HashMap<>();
     map.put("number", number);
     map.put("alabo", alabo);
     map.put("chinese", chinese);
     list.add(map);
     }
    }
    for (Map<String, Object> map : list) {
     System.out.println(map);
    }
    System.out.println("成功率:"+Double.valueOf(right/(double)total));
    
    • テスト後の正答率は 1 。 つまり、エラーは0です。
    • 間違いの指摘はご自由にどうぞ。

    ソースコード

    
    package org.zxhtom.utils;
    import org.zxhtom.constant.ChineseNumber;
    import java.util.*;
    /**
     * @package org.zxhtom.utils
     * @Class DigitUtil
     * @Description デジタル・ツール・クラス
     * 
     * 
     */
    public class DigitUtil {
     private static DigitUtil util;
     public static DigitUtil getInstance() {
     if (null == util) {
     util = new DigitUtil();
     }
     return util;
     }
     /**
     *  をアラビア にする
     * 12,350と54--> 12354
     * @param chinese アラビア数字
     * @return 数字
     */
     public String getNumberFromChinese(String chinese) {
     String result = "0";
     //数字を4ビットで傍受する。こうすることで、1つの
     List<String> lists = new ArrayList<>();
     //には当面使用しない。
     int lastLevelIndex = 0;
     //ループ・トラバーサル、数十億の分離を目指す
     for (int i = ChineseNumber.highLevel.size()-1; i>=0; i--) {
     //億単位が出現するインデックスを決定する
     int levelIndex = chinese.indexOf(ChineseNumber.highLevel.get(i));
     if (levelIndex>0) {
     //ユニットのインデックスがあることを示し、ユニットの前のデータをインターセプトしてリストにロードする。ループはその後も続く。
     lists.add(chinese.substring(0, levelIndex));
     chinese = chinese.substring(levelIndex+1);
     } else if (levelIndex == -1) {
     //万を超えない、すでに最も低いユニットであることを示す。リストに直接追加 , このケースは、高いユニットが分離された後、2番目に高いユニットが0から始まるケースに対応する。
     lists.add(ChineseNumber.number.get(0));
     } else if (levelIndex == 0) {
     while (levelIndex > 1) {
     levelIndex--;
     lists.add(ChineseNumber.number.get(0));
     }
     //直接参加
     lists.add(chinese);
     }
     }
     //区切られた4ビットのデータを別々に翻訳する
     for (int i = 0; i < lists.size(); i++) {
     // 
     Integer highLevelIndex = lists.size() - i - 1;
     //ユニットデータを取得する
     String single = lists.get(i);
     //ユニットデータを翻訳する.
     String nextResult = getNumberFromFChinese(single);
     //listsそれぞれ4桁の切片なので、積み重ねるには10000倍する必要がある。
     Long next = Long.valueOf(Integer.valueOf(result) * (int)(Math.pow(10, 4)) + Integer.valueOf(nextResult));
     result = next.toString();
     }
     //先頭の0を消す
     result = result.replaceFirst("^(0+)", "");
     return result;
     }
     /**
     * 数字で4桁のアラビア数字を取得する
     * 万以内のデータ変換
     * @param single
     * @return
     */
     private String getNumberFromFChinese(String single) {
     String result = "0";
     Integer highIndex = 1;
     for (int i = 0; i < single.length(); i++) {
     String str = String.valueOf(single.charAt(i));
     int unit = ChineseNumber.level.indexOf(str);
     int number = ChineseNumber.number.indexOf(str);
     if (unit == -1) {
     //現在の数字は10,000までの単位、すなわち数千、数百、数十のうちの一つである。
     int next = 0;
     if (i < single.length() - 1) {
     //最後尾でない場合、現在地の重みを考慮する必要がある
     next = ChineseNumber.level.indexOf(String.valueOf(single.charAt(i + 1)));
     }
     result=String.valueOf(Integer.valueOf(result)+number * (int) (Math.pow(10, next)));
     }
     }
     //ウェイトスタッキング
     result = ""+Integer.valueOf(result) * (int) (Math.pow(10, highIndex - 1));
     return result;
     }
     /**
     * アラビア数字から数字へ
     * 12354 --> 12,300と54
     * @param alabo アラビア数字
     * @return 数字
     */
     public String getNumberFromAlabo(String alabo) {
     String result = "";
     List<String> list = new ArrayList<>();
     for (int length = alabo.length()-1; length >= 0; length--) {
     list.add(String.valueOf(alabo.charAt(length)));
     }
     List<List<String>> lists = CollectionUtil.averageSize(list, 4);
     Collections.reverse(lists);
     if (CollectionUtil.isNotEmpty(lists)) {
     for (int index=0;index<lists.size();index++) {
     List<String> singleNumList = lists.get(index);
     //コレクションを反転させる
     Collections.reverse(singleNumList);
     //デフォルト 0 false
     Boolean zeroflag =false;
     String chinese = "";
     for (int j=0 ; j<singleNumList.size();j++) {
     Integer number = Integer.valueOf(singleNumList.get(j));
     if (number == 0 && !zeroflag && afterNotAllZero(singleNumList, j)) {
     //0に続いて、すべてが0ではない小さな単位に初めて遭遇した。
     chinese += ChineseNumber.number.get(number);
     //遭遇ゼロの状態を真に修正する
     zeroflag = true;
     } else if(number!=0) {
     //対応する番号をマップする
     chinese += ChineseNumber.number.get(number) + ChineseNumber.level.get(singleNumList.size()-j-1);
     }
     }
     if (index==lists.size()&&chinese.substring(0, 1).equals(ChineseNumber.number.get(0))) {
     //条件は決して成立しない
     chinese = chinese.substring(1);
     }
     //その上級ユニットが効果を発揮するためには、すべてが0であるとは限らない
     if (chinese.length()>0&&!ChineseNumber.highLevel.contains(chinese.substring(chinese.length() - 1))) {
     result += chinese + ChineseNumber.highLevel.get(lists.size() - 1 - index);
     }
     }
     }
     return result;
     }
     /**
     * singleNumListが位置jの後でゼロでいっぱいかどうかを判定する。
     * @param singleNumList
     * @param j
     * @return
     */
     private boolean afterNotAllZero(List<String> singleNumList, int j) {
     for (int i = j+1; i < singleNumList.size(); i++) {
     if (!"0".equals(singleNumList.get(i))) {
     return true;
     }
     }
     return false;
     }
     public static void main(String[] args) {
     Integer right = 0;
     Integer total = 10000000;
     List<Map<String, Object>> list = new ArrayList<>();
     for (int i = 0; i < total; i++) {
     Integer number = MathUtil.getInstance().getRandom(1, 1000000000);
     //System.out.println(i);
     //Integer number = 400001989;
     String chinese = DigitUtil.getInstance().getNumberFromAlabo(number.toString());
     String alabo = DigitUtil.getInstance().getNumberFromChinese(chinese);
     boolean equals = alabo.equals(number.toString());
     if (equals) {
     right++;
     } else {
     Map<String, Object> map = new HashMap<>();
     map.put("number", number);
     map.put("alabo", alabo);
     map.put("chinese", chinese);
     list.add(map);
     }
     }
     for (Map<String, Object> map : list) {
     System.out.println(map);
     }
     System.out.println("成功率:"+Double.valueOf(right/(double)total));
     }
    }
    

    Read next

    手書きのPromiseコア原則

    Promiseの現在の状態は、wait、execute、rejectのいずれかでなければなりません。 Promiseオブジェクトの下にthenメソッドをチェーンする場合、thenメソッドのコールバック関数はPromiseオブジェクトを返すことができますが、別の...

    Feb 21, 2020 · 19 min read