1038:苹果和虫子
1038:蘋果和蟲子
時間限制: 1000 ms 內存限制: 65536 KB【題目描述】
你買了一箱n個蘋果,很不幸的是買完時箱子里混進了一條蟲子。蟲子每x小時能吃掉一個蘋果,假設蟲子在吃完一個蘋果之前不會吃另一個,那么經過y小時你還有多少個完整的蘋果?
【輸入】
輸入僅一行,包括n,x和y(均為整數)。
【輸出】
輸出也僅一行,剩下的蘋果個數。
【輸入樣例】
10 4 9【輸出樣例】
7說明:
主要考查用編程解決數學問題。
不過這題存在一個問題,不知官方會不會修正,后面會講述此問題。
思路分析:
用題目的樣例,可以理解為有10個蘋果,蟲子每4小時吃掉一個蘋果,經過9小時還有7個完整的蘋果。
這題應注意題目的關鍵部分:第一個是剩余的是完整的蘋果,那么被蟲子咬了一口都不算完整;第二個是蟲子在吃完一個蘋果之前不會吃另一個。
數學的方法可以這么解:
10-9÷4=10-2.5=7.5
即還剩7.5個蘋果,但完整的只有7個,那0.5個(半個)不算完整。所以輸出的結果是7。
很明顯,是把計算出的結果去掉小數部分,只剩整數部分。解決這一問題,只需強制轉換為整型即可。不過在運算中存在除法時,要考慮數據類型問題,如果變量的類型都為整型時,那么9 / 4的結果為2,10 - 2的結果是8。下面用兩種方法來解決這一問題:
變量都聲明為double類型:
(整型)(n - y / x)
變量都聲明為整型:
(整型)(n - 1.0 * y / x)
或者使用向上取整函數ceil。
不過這些方法的本質是一樣的,都是讓數據變為浮點型進行運算。
如果把變量聲明為整型,因為此類問題不會存在負數,應該優先選擇unsigned類型,而不是int。
易錯點:
本題對于數據的說明并不嚴謹,如果y的值足夠大,當y / x > n時,結果為負數。顯然這是不可能的,這種問題不會存在負數的情況,就算蘋果全被蟲子吃光,結果也為0而已。
而本題屬于順序結構的題,按照學習階梯來看,學生還沒學if語句和條件運算符等知識點。
經過測試,提交后第4個測試點沒有通過。想全部通過,一般還是要用if語句或條件運算符等。
所以,如果使用if語句,變量的類型應選擇int或double,而不是unsigned。因為當y / x > n時,結果為負數,此時就可以通過if來判斷了,而選擇unsigned類型就不是那么方便了。
代碼中會展示這兩種方法。
求解過程:
聲明3個unsigned類型變量n、x、y。輸入3個整數給變量n、x、y。根據公式輸出運算結果。運行結果:
前一種方法結算的結果存在負數,所以有一個測試點沒有通過。后一種方法使用了if條件語句,是把結果先保存在變量t中,如果變量t為負數,則讓t變為0。int(n - y * 1.0 / x)這條語句的int可以去掉,因為這條語句的結果是賦給一個int類型變量t,會自動轉換成int類型。參考代碼 - C++:
此代碼有一個測試點沒有通過。
#include <iostream> using namespace std; int main() {unsigned n, x, y;cin >> n >> x >> y;cout << unsigned(n - y * 1.0 / x);return 0; }參考代碼 - C語言:
此代碼有一個測試點沒有通過。
#include <stdio.h> int main() {double n, x, y;scanf("%lf %lf %lf", &n, &x, &y);printf("%u", (unsigned)(n - y / x));return 0; }總結
以上是生活随笔為你收集整理的1038:苹果和虫子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch开启安全认证详
- 下一篇: java 创建Reader_Buffer