常规迭代

  1. #include <stdio.h>
  2. int main()
  3. {
  4. //记录一开始拿到的瓶数
  5. int full = 0;
  6. //测试用例分隔,非法输入跳过
  7. while(scanf("%d",&full)!=EOF&&full!=0)
  8. {
  9. //记录余数
  10. int re = 0;
  11. //记录取整结果
  12. int mul = 0;
  13. //记录总共换取的瓶数
  14. int result = 0;
  15. while(1)
  16. {
  17. // 10/3=3...1
  18. // (3+1)/3=1...1
  19. // (1+1)/3=0...2
  20. //result = 3+1+0 + 1(借瓶)
  21. mul = full/3;
  22. re = full%3;
  23. result += mul;
  24. if((mul+re)<2)
  25. {
  26. //瓶子不够了
  27. break;
  28. }
  29. else if((mul+re)==2)
  30. {
  31. //借了一个空瓶
  32. result++;
  33. break;
  34. }
  35. else
  36. {
  37. //取整加余数
  38. full = mul+re;
  39. }
  40. }
  41. printf("%d\n",result);
  42. }
  43. return 0;
  44. }

数学处理

然而可以有更巧妙的数学办法解决
三瓶换一瓶,允许借,那么可以一喝两瓶就去换,也就是每两瓶就能换一瓶,直接将输入除以二取整即可

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int full = 0;
  5. while(scanf("%d",&full)!=EOF&&full!=0)
  6. {
  7. printf("%d\n",full/2);
  8. }
  9. return 0;
  10. }