藍橋杯 飲料換購 數學推導

題目描述

樂羊羊飲料廠正在舉辦一次促銷優惠活動。
樂羊羊C型飲料,憑3個瓶蓋能夠再換一瓶C型飲料,而且能夠一直循環下去(但不容許暫借或賒帳)。
請你計算一下,若是小明不浪費瓶蓋,儘可能地參加活動。
那麼,對於他初始買入的n瓶飲料,最後他一共能喝到多少瓶飲料。 

輸入

輸入存在多組測試數據
每組測試數據輸入一行包含一個正整數n(1<=n<=10000)

輸出

對於每組數據輸出一行,包含一個整數,表示實際獲得的飲料數

樣例輸入 Copy

100
101

樣例輸出 Copy

149
151




每三瓶能夠兌換一瓶,也就是每次減三後必需要加一。所以其實是每兩瓶能夠使得答案加一。
可是有一種特殊狀況,即當飲料數爲2的時候,此時沒法兌換,須要特判。

根據乘法的性質:
奇數 * 奇數 = 奇數
偶數 * 奇數 = 偶數

也就是說,若是一開始有奇數瓶飲料x,根據每三換一的規則,若x是3的倍數,那麼兌換一次後仍然是奇數瓶;若不是3的倍數,那麼 x % 3 + x / 3 也是奇數。因此無需特判,答案爲 x + x / 2。

若是一開始是偶數瓶飲料x, 根據兌換規則,若x是3的倍數,那麼兌換一次後仍然是偶數瓶;若不是3的倍數,那麼 x % 3 + x / 3 也是偶數。這樣偶數瓶飲料不停的兌換,最後必定會小於3,根據前面推出的性質,最後的數必定是偶數,所以是2。
須要特判,答案爲 x + x / 2 - 1.

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int n;
11     while(scanf("%d", &n) != EOF)
12     {
13         if(n == 0)
14             printf("0\n");
15         else
16         {
17             int t = n / 2;
18             if(n % 2 == 1)
19                 printf("%d\n", n + t);
20             if(n % 2 == 0)
21                 printf("%d\n", n + t - 1);
22         }
23 
24     }
25     return 0;
26 }
相關文章
相關標籤/搜索