【百元买百鸡】

/**
 * 反转数字
 *
 * @param n 要反转的数字
 * @return 反转后的数字
 */
async function reverse(n) {
  return Number(
    n
      .toString()
      .split('')
      .reverse()
      .join('')
  );
}
export default class Test {
  // 回文数字
  async palindrome(num) {
    /**
     * 1: 如果是小于9的个位数,直接+1输出
     * 2: 如果大于1位数,分为是偶数位还是奇数位
     * 2.1: 偶数位,平均拆分为两个数,把前面数反转, 比较 后面数是否大于反转的数,
     * 2.1.1: 小于,把后面的改为前面数反转
     * 2.1.2: 大于或等于:前面数+1,再反转+1的数.拼接
     * 2.2: 奇数位, 以中间数为中心,拆分两个数,比较前面数反转 是否大于后面数
     * 2.2.1: 大于,直接把反转后的数放到后面
     * 2.2.2: 小于或等于,也用用反转后的数,中间数+1
     */
    if (num < 9) return num + 1;
    if (num === 9) return 11;

    // 大于一位数
    const numLength = num.toString().length;
    // 当是偶数的时候
    if (numLength % 2 === 0) {
      // 如果长度是偶数,后几位是否大于前几位
      const start = num.toString().substr(0, numLength / 2);
      const end = num.toString().substr(numLength / 2, numLength / 2);
      // 把前面的数字反转
      let newStart = await reverse(start);
      // 如果反转后的数大于后几位数,直接应用反转的数,如果小于,钱几位数+1,反转前几位,拼接+1和反转后的数
      if (newStart > end) {
        return `${start}${newStart}`;
      } else {
        const start1 = Number(start) + 1;
        newStart = await reverse(start1);
        return `${start1}${newStart}`;
      }
    }
    if (numLength % 2 === 1) {
      // 截取长度
      const subLength = (numLength - 1) / 2;
      const start = Number(num.toString().substr(0, subLength));
      const end = Number(num.toString().substr(subLength + 1, subLength));
      let center = Number(num.toString().substr(subLength, 1));
      // 把前面的数反转
      const startReverse = await reverse(start);
      // 如果反转的数大于后面的数,直接把反转后的数放到后面
      if (startReverse > end) {
        return `${start}${center}${startReverse}`;
      } else {
        center += 1;
        return `${start}${center}${startReverse}`;
      }
    }
  }
}

/**
 * 百元买百鸡 公鸡5,母鸡3,小鸡三只1
 *
 * 公鸡最多买100 / 5 = 20,
 * 母鸡最多买 100 / 3 = 33
 * 小鸡最多买 300
 */
for (let i = 0; i < 20; i++) {
  for (let j = 0; j < 33; j++) {
    const q = 100 - i - j;
    if (i + j + q === 100 && 5 * i + 3 * j + q / 3 === 100) {
      console.log({i, j, q});
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值