华为OD机试真题 JavaScript 实现【人民币转换】【牛客练习题】

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、JavaScript算法源码

专栏导读

本专栏收录于《华为OD机试(JavaScript)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

  • 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。

在这里插入图片描述

一、题目描述

考试题目和要点:

  1. 中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。
  2. 中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。
  3. 阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如6007.14,应写成“人民币陆仟零柒元壹角肆分“。
  4. 10应写作“拾”,100应写作“壹佰”。例如,1010.00应写作“人民币壹仟零拾元整”,110.00应写作“人民币壹佰拾元整”
  5. 十万以上的数字接千不用加“零”,例如,30105000.00应写作“人民币叁仟零拾万伍仟元整”

二、输入描述

输入一个double数。

三、输出描述

输出人民币格式。

四、解题思路

  1. 输入一个double数;
  2. 使用split(“\.”)将输入的数分割为整数部分和小数部分,并存储在字符串数组s中;
  3. 判断小数部分是否为"00",如果是,则输出整数部分的中文大写金额数字后跟"元整";
  4. 判断整数部分是否为"0",如果是,则输出小数部分的中文大写金额数字;
  5. 如果不满足以上两种情况,输出整数部分的中文大写金额数字后跟"元",再输出小数部分的中文大写金额数字;
  6. 实现solveXiao函数,接收小数部分的字符串作为参数,返回小数部分的中文大写金额数字;
    • 将小数部分的第一个字符转换为整数,表示角;
    • 将小数部分的第二个字符转换为整数,表示分;
    • 如果角不为0,则添加角的中文大写金额数字和"角";
    • 如果分不为0,则添加分的中文大写金额数字和"分";
    • 返回拼接后的字符串;
  7. 实现solveZheng函数,接收整数部分的double数作为参数,返回整数部分的中文大写金额数字;
    • 使用StringBuilder来拼接中文大写金额数字;
    • 使用pow变量来表示权值的索引,初始值为0;
    • 使用循环,当整数部分不为0时进行迭代;
    • 在每次迭代中,根据权值索引添加"万"或"亿"到拼接的字符串中;
    • 将整数部分模10000得到四位数的临时值temp;
    • 提取临时值的个位、十位、百位和千位的数字;
    • 判断个位是否为0,如果不为0,则添加个位的中文大写金额数字;
    • 判断十位是否为0,如果不为0,则添加"拾"和十位的中文大写金额数字(如果十位为1,则不添加十位的中文大写金额数字);
    • 判断百位是否为0,如果不为0,则添加"佰"和百位的中文大写金额数字;
    • 判断千位是否为0,如果不为0,则添加"仟"和千位的中文大写金额数字;
    • 更新整数部分为整数部分除以10000的结果,用于下一次迭代;
    • 更新权值索引,当索引超过2时,重置为1;
    • 循环结束后,将拼接的字符串反转,并返回作为结果;
  8. 在主函数中,使用while循环读取输入的每个测试用例;
  9. 根据题目要求,输出人民币格式的中文大写金额数字

五、JavaScript算法源码

const ten = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
const power = ["万", "亿"];
const daiwei = ["元", "角", "分", "整"];

function solveXiao(s2) {
  let sb = "";
  const jiao = parseInt(s2[0]);
  const fen = parseInt(s2[1]);
  if (jiao !== 0) {
    sb += ten[jiao] + "角";
  }
  if (fen !== 0) {
    sb += ten[fen] + "分";
  }
  return sb;
}

function solveZheng(zheng) {
  let sb = "";
  let pow = 0;
  while (parseInt(zheng) !== 0) {
    if (pow !== 0) {
      sb += power[pow - 1];
    }
    const temp = parseInt(zheng % 10000);
    const gewei = temp % 10;
    const shiwei = Math.floor((temp / 10) % 10);
    const baiwei = Math.floor((temp / 100) % 10);
    const qianwei = Math.floor((temp / 1000) % 10);
    if (gewei !== 0) {
      sb += ten[gewei];
    }
    if (shiwei !== 0) {
      sb += "拾";
      if (shiwei !== 1) {
        sb += ten[shiwei];
      }
    } else {
      if (gewei !== 0 && (temp > 99 || parseInt(zheng) > 10000)) {
        sb += ten[0];
      }
    }
    if (baiwei !== 0) {
      sb += "佰";
      sb += ten[baiwei];
    } else {
      if (shiwei !== 0 && (temp > 999 || parseInt(zheng) > 10000)) {
        sb += ten[0];
      }
    }
    if (qianwei !== 0) {
      sb += "仟";
      sb += ten[qianwei];
    } else {
      if (baiwei !== 0 && parseInt(zheng) > 10000) {
        sb += ten[0];
      }
    }
    zheng /= 10000;
    pow++;
    if (pow > 2) {
      pow = 1;
    }
  }
  return sb.split('').reverse().join('');
}

function formatRMB(num) {
  const s = num.toString().split(".");
  if (s[1] === "00") {
    return "人民币" + solveZheng(parseInt(s[0])) + "元整";
  } else if (s[0] === "0") {
    return "人民币" + solveXiao(s[1]);
  } else {
    return "人民币" + solveZheng(parseInt(s[0])) + "元" + solveXiao(s[1]);
  }
}

下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,javascript,开发语言,我心中的TOP1编程语言,矩阵,前端)