由于上一次写的时候,没考虑到的地方比较多,这次呢,又重新想了一遍,代码如下:
思想:买三送一问题,我分了两块,第一块用来计算买n瓶可以得到几瓶,第二块是拿着第一块得到的结果与实际人数相比,如果刚好小于人数,则停止计算,得到买了多少瓶,但是这时候买的并且最终得到的瓶数数小于人数的,所以还要再多买一瓶才够;这里有个注意点:当买的瓶数不超过”三”的时候,直接返回买的瓶数(因为不会送的);还有一个注意点就是:当买的a瓶后得到b瓶,b刚好和人数相等,则买a瓶就够了;
思想二:买a瓶,则一共可以得到多少瓶?这个问题的答案是a加a与3的商,因为只要有商,就说明买的瓶数是3的多少倍,即送的瓶数,然后再拿商加上a与3的余数的和为b,使用b去递归,进行下一次计算,只要是3的倍数,就继续计算下去…..
-(NSInteger)personCount:(NSInteger)personCount{
//一共N个人,返回需要购买的瓶数
for (NSInteger i = personCount; i > 0; i --) {
self.result = i;
[self buyCount:i];
if (_result == personCount) {
return i;
}
if (_result < personCount) {
personCount = i + 1;
return i + 1;
}
}
return personCount;
}
#pragma 购买n瓶,返回最后能喝多少瓶
-(void)buyCount:(NSInteger)buyCount{
//如果购买的瓶数小于3.则直接返回购买的瓶数
if (_result < 3) {
return ;
}
//购买n瓶,返回最后能喝多少瓶
//求出购买的瓶数与3的商
NSInteger b = buyCount / 3;
//求出购买的瓶数与3的余数
NSInteger c = buyCount % 3;
//只要商与余数之和大于等于3
if (b + c >= 3) {
//将商加到一个全局变量result中,result初始值是购买的瓶数
self.result += b;
//递归继续计算
[self buyCount:b + c];
}else{
//如果商与余数的和不大于3,则也要将商加到全局result中
self.result += b;
return;
}
}