1. 程式人生 > >藍橋杯 演算法 啤酒和飲料

藍橋杯 演算法 啤酒和飲料

啤酒每罐2.3元,飲料每罐1.9元。小明買了若干啤酒和飲料,一共花了82.3元。

我們還知道他買的啤酒比飲料的數量少,請你計算他買了幾罐啤酒。

博主的辦法是用兩個for迴圈,我想到的是用一個for迴圈,思路是用for迴圈不斷增加啤酒的數量,並通過(int)82.3-2.3*i/1.9(i為啤酒的數量)計算飲料的最大數量,在for迴圈裡新增一個判斷語句,判斷對應數量的飲料和啤酒是否是82.3元,若是,則結果正確,對應的程式碼為:

#include <iostream>  
int main(int argc, char** argv) {  
    float money;  
    int jiu, yin, i, k;  
    for(i=0;i<20;i++)  //當i大於20時,啤酒數大於飲料數,條件不符合;
    {  
        if(82.3 == ((int)((82.3-2.3*i)/1.9))*1.9+2.3*i)  
        // 先計算買了i罐啤酒後還能買多少罐飲料,結果會是浮點數  
        //取整後再計算對應數量的飲料和i罐啤酒的總額是否是82.3,若是,則結果正確,結束   
        {  
            printf("%d",i);  
            break;  
        }  
    }  
      
    return 0;  
} 
但是忽略了一個缺陷:float不能用==判斷,後經博主提醒,更改後的程式碼:
#include <iostream>    
#include<stdio.h>  
#include<math.h>  
#define eps 1e-8  
using namespace std;  
int main(int argc, char** argv) {    
    float money;    
    int jiu, yin, i, k;    
    for(i=0;i<35;i++)    
    {    
        if(fabs(82.3-(((int)((82.3-2.3*i)/1.9))*1.9+2.3*i))<eps)  
        // 先計算買了i罐啤酒後還能買多少罐飲料,結果會是浮點數    
        //取整後再對應數量的飲料和i罐啤酒的總額是否是82.3,若是,則結果正確,結束     
        {    
            printf("%d",i);    
            break;    
        }    
    }    
        
    return 0;    
}  
在此再次感謝博主的分享和提醒,謝謝!