冰激凌店举行活动每买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))