别太依赖ChatGpt了,他没那么可靠

2,774 阅读2分钟

背景

最近找工作的人太多了,在看面试题,时刻准备好Run,这是我碰到的一道面试题,在面试的过程中,我实现了个大概,面完之后我想要实现一个更完美的版本,我求助了下ChatGpt(不想动脑),以下是我的一些求助过程。

题目

实现一个函数,输入阿拉伯数字转换成中文汉字返回

我的指令过程

  • 第一次询问

image.png

嗯,是我没说清楚,我其实想要js实现的版本

  • 第二次询问

image.png

实现代码如下:

function num2cn(number) {
  // 定义中文数字字符
  const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  // 定义中文数字单位
  const cn_units = ['', '十', '百', '千', '万', '亿'];
  // 将数字转换为字符串并逆序
  const str_num = number.toString().split('').reverse().join('');
  // 初始化中文数字字符串
  let cn_str = '';
  // 遍历数字字符串
  for (let i = 0; i < str_num.length; i++) {
    // 将字符转换为数字
    const num = parseInt(str_num.charAt(i));
    // 如果当前数字是零并且不是第一位或万位或亿位
    if (num === 0 && (i !== 0 && i % 4 !== 0)) {
      // 如果中文数字字符串的最后一个字符不是零,则添加零
      if (cn_str.charAt(cn_str.length - 1) !== cn_nums[0]) {
        cn_str += cn_nums[0];
      }
    } 
    // 如果当前数字不是零
    else {
      // 添加中文数字字符
      cn_str += cn_nums[num];
      // 如果当前数字不是个位数,添加中文数字单位
      if (i !== 0) {
        cn_str += cn_units[i % 4];
      }
      // 如果当前数字是万位或亿位,添加中文数字单位
      if (i % 4 === 0 && i !== 0) {
        cn_str += cn_units[i % 4 + 1];
      }
    }
  }
  // 将中文数字字符串反转并返回
  return cn_str.split('').reverse().join('');
}

我随便输入了个数字进行测试,发现结果是有问题的

  • 第三次询问

image.png 实现代码如下:

function num2cn(number) {
  // 定义中文数字字符
  const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  // 定义中文数字单位
  const cn_units = ['', '十', '百', '千', '万', '亿'];
  // 将数字转换为字符串并逆序
  const str_num = number.toString().split('').reverse().join('');
  // 初始化中文数字字符串
  let cn_str = '';
  // 记录当前数字是否为零
  let is_zero = true;
  // 遍历数字字符串
  for (let i = 0; i < str_num.length; i++) {
    // 将字符转换为数字
    const num = parseInt(str_num.charAt(i));
    // 如果当前数字是零
    if (num === 0) {
      // 如果不是万位或亿位
      if (i % 4 !== 0) {
        // 如果前一个数字不是零,则添加零
        if (!is_zero) {
          cn_str += cn_nums[0];
        }
        is_zero = true;
      }
      // 如果是万位或亿位
      else {
        // 添加中文数字单位
        cn_str += cn_units[i % 4 + 1];
        is_zero = true;
      }
    }
    // 如果当前数字不是零
    else {
      // 添加中文数字字符
      cn_str += cn_nums[num];
      // 如果不是个位数,添加中文数字单位
      if (i !== 0) {
        cn_str += cn_units[i % 4];
      }
      is_zero = false;
    }
  }
  // 如果中文数字字符串以零结尾,则去掉零
  if (cn_str.charAt(cn_str.length - 1) === cn_nums[0]) {
    cn_str = cn_str.slice(0, -1);
  }
  // 将中文数字字符串反转并返回
  return cn_str.split('').reverse().join('');
}
  • 第四次询问

image.png

function num2cn(number) {
  // 定义中文数字字符
  const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  // 定义中文数字单位
  const cn_units = ['', '十', '百', '千', '万', '亿'];
  // 将数字转换为字符串并逆序
  const str_num = number.toString().split('').reverse().join('');
  // 初始化中文数字字符串
  let cn_str = '';
  // 记录当前数字是否为零
  let is_zero = true;
  // 记录是否需要添加万或亿
  let need_add_unit = false;
  // 遍历数字字符串
  for (let i = 0; i < str_num.length; i++) {
    // 将字符转换为数字
    const num = parseInt(str_num.charAt(i));
    // 如果当前数字是零
    if (num === 0) {
      // 如果是万位或亿位
      if (i % 4 === 0) {
        need_add_unit = true;
      }
      // 如果不是万位或亿位,且前一个数字不是零
      else if (!is_zero) {
        cn_str = cn_nums[0] + cn_str;
        is_zero = true;
      }
    }
    // 如果当前数字不是零
    else {
      // 添加中文数字字符和中文数字单位
      cn_str = cn_nums[num] + cn_units[i % 4] + cn_str;
      is_zero = false;
      // 如果是万位或亿位,需要添加中文数字单位
      if (i % 4 === 0) {
        cn_str = cn_units[4 + Math.floor(i / 4)] + cn_str;
        need_add_unit = false;
      }
    }
  }
  // 如果中文数字字符串以零结尾,则去掉零
  if (cn_str.charAt(cn_str.length - 1) === cn_nums[0]) {
    cn_str = cn_str.slice(0, -1);
  }
  // 如果需要添加万或亿,则在最前面添加中文数字单位
  if (need_add_unit) {
    cn_str = cn_units[4 + Math.floor(str_num.length / 4)] + cn_str;
  }
  return cn_str;
}

我测试了一下依旧不行,但其实我没怎么看实现逻辑,我单纯想要当一个伸手党。

  • 第五次询问

image.png

function num2cn(number) {
  // 定义中文数字字符
  const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  // 定义中文数字单位
  const cn_units = ['', '十', '百', '千', '万', '亿'];
  // 将数字转换为字符串并逆序
  const str_num = number.toString().split('').reverse().join('');
  // 初始化中文数字字符串
  let cn_str = '';
  // 记录当前数字是否为零
  let is_zero = true;
  // 记录是否需要添加万或亿
  let need_add_unit = false;
  // 遍历数字字符串
  for (let i = 0; i < str_num.length; i++) {
    // 将字符转换为数字
    const num = parseInt(str_num.charAt(i));
    // 如果当前数字是零
    if (num === 0) {
      // 如果是万位或亿位
      if (i % 4 === 0 && i !== 0) {
        need_add_unit = true;
      }
      // 如果不是万位或亿位,且前一个数字不是零
      else if (!is_zero) {
        cn_str = cn_nums[0] + cn_str;
        is_zero = true;
      }
    }
    // 如果当前数字不是零
    else {
      // 添加中文数字字符和中文数字单位
      cn_str = cn_nums[num] + cn_units[i % 4] + cn_str;
      is_zero = false;
      // 如果是万位或亿位,需要添加中文数字单位
      if (i % 4 === 0 && i !== 0) {
        cn_str = cn_units[4 + Math.floor(i / 4)] + cn_str;
        need_add_unit = false;
      }
    }
  }
  // 如果中文数字字符串以零结尾,则去掉零
  if (cn_str.charAt(cn_str.length - 1) === cn_nums[0]) {
    cn_str = cn_str.slice(0, -1);
  }
  // 如果需要添加万或亿,则在最前面添加中文数字单位
  if (need_add_unit) {
    cn_str = cn_units[4 + Math.floor((str_num.length - 1) / 4)] + cn_str;
  }
  // 如果数字为100000000,则特殊处理
  if (number === 100000000) {
    cn_str = '一亿';
  }
  return cn_str;
}
  • 第六次询问,我开始不耐烦了

image.png

console.log(num2cn(0)); // 零
console.log(num2cn(10)); // 十
console.log(num2cn(20)); // 二十
console.log(num2cn(110)); // 一百一十
console.log(num2cn(302)); // 三百零二
console.log(num2cn(1002)); // 一千零二
console.log(num2cn(1012)); // 一千零一十二
console.log(num2cn(10020)); // 一万零二十
console.log(num2cn(12345)); // 一万二千三百四十五
console.log(num2cn(100000)); // 十万
console.log(num2cn(100001)); // 十万零一
console.log(num2cn(100100)); // 十万零一百
console.log(num2cn(102000)); // 十万零二千
console.log(num2cn(1000000)); // 一百万
console.log(num2cn(10010000)); // 一千零一十万
console.log(num2cn(100010000)); // 一千万零一万
console.log(num2cn(100000000)); // 一亿

我以为这次他写对了,但是再测一下还是错的

  • 第七次询问

image.png

function num2cn(num) {
  if (typeof num !== 'number') {
    throw new Error('Input must be a number');
  }
  if (num < 0 || num >= 1e12) {
    throw new Error('Input must be a non-negative integer less than 1e12');
  }
  if (num === 0) {
    return '零';
  }
  const units = ['', '十', '百', '千'];
  const digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  const bigUnits = ['', '万', '亿'];
  let result = '';
  let index = 0;
  while (num > 0) {
    let currentNum = num % 10000;
    let currentStr = '';
    if (currentNum === 0) {
      currentStr = '零';
    } else {
      let count = 0;
      while (currentNum > 0) {
        let digit = currentNum % 10;
        if (digit > 0) {
          currentStr = digits[digit] + units[count] + currentStr;
        } else {
          // 当前位是 0 时需要特判,避免多个零连续出现
          if (currentStr.charAt(0) !== '零') {
            currentStr = digits[digit] + currentStr;
          }
        }
        count++;
        currentNum = Math.floor(currentNum / 10);
      }
    }
    result = currentStr + bigUnits[index] + result;
    index++;
    num = Math.floor(num / 10000);
  }
  // 最后的 '一十' 转为 '十'
  result = result.replace(/^一十/, '十');
  return result;
}
  • 第八次询问

image.png

是他累了么

结论

首先必须得肯定chatGpt带来的革命性突破,但这里也要提醒像我一样的伸手党,不要太依赖ChatGpt了,他出思路是很快,但是距离写完后能不能直接上生产的问题,我想他还有很大的距离。他的准确度没有达到100%,我们依旧需要花时间去验证他的思路已经实现是否百分百可靠。