关于#javascript#的问题:冰激凌店举行活动每买k个(k常量等于3)返还玩家半个冰激凌价格的钱已知冰激凌价格为m你的资金为n求能买多少冰激凌r

冰激凌店举行活动每买k个(k常量等于3)返还玩家半个冰激凌价格的钱已知冰激凌价格为m你的资金为n求能买多少冰激凌r

例如m=4n=24结果:r=7
例如m=1n=10结果:r=11
例如m=10n=6485结果:r=778

只写出了不能赊账的情况, 可以赊账的情况有空在写, 这有一个js在写运行的网站, 很方便 https://www.sojson.com/runjs.html

//每多少个可以换钱
let k = 3;
//单价
let price = 3;
console.log("单价: " + price + ", 每" + k + "个可以换" + price/2 + "块钱");
function count( total){
    //可以买多少个
    let num =  Math.trunc(total/price);
    //可以换多少钱
    let returnMany = Math.trunc(num/k) * price/2;
    //买完之后剩余的零头
    let total2 = total - num * price;
    console.log('总金额'+total+', 可以买'+num+'个, 剩余'+total2+'块钱, 可以换'+returnMany+'快钱');
    //买完之后剩余的零头 + 换的钱
    total = total2 + returnMany;
    if(total < price){
        return num;
    }else{
        num += count(total);
    }
    return num;
}
console.log('150块钱可以买'+count(150));
console.log('98块钱可以买'+count(98));
/**
 * 递归
 * @param {number} m 冰激凌单价
 * @param {number} n 资金
 * @param {number} k 
 * @param {number} surplus 剩余兑换次数
 * @returns 
 */
function buyIceCream(m, n, k = 3, surplus = 0) {
  if (m > n) return 0
  // 购买的数量
  const count = n / m | 0
  // 购买后剩余的资金
  const remainder = n % m
  // 返还的钱
  const returnMoney = ((surplus + count) / k | 0) * m / 2
  // 当前剩余的总资金
  const current = remainder + returnMoney
  return count + buyIceCream(m, current, k, (surplus + count) % k)
}

/**
 * 迭代
 * @param {number} m 冰激凌单价
 * @param {number} n 资金
 * @param {number} k 
 * @returns 
 */
function buyIceCream(m, n, k = 3) {
  if (m > n) return 0
  let count = 0, surplus = 0
  while (n >= m) {
    // 本轮买的冰激凌数量
    let number = n / m | 0
    count += number
    // 剩余总资金
    n = n % m + ((surplus + tmp) / k | 0) * m / 2
    // 剩余兑换次数
    surplus = (surplus + count) % k
  }
  return count
}

console.log(buyIceCream(4, 24))
console.log(buyIceCream(1, 10))
console.log(buyIceCream(10, 6485))