1. 程式人生 > >一本通1074:津津的儲蓄計劃

一本通1074:津津的儲蓄計劃

pac 圖片 spa rac 否則 src click 零花錢 就會

1074:津津的儲蓄計劃

技術分享圖片
【題目描述】
津津的零花錢一直都是自己管理。每個月的月初媽媽給津津300元錢,津津會預算這個月的花銷,並且總能做到實際花銷和預算的相同。

   為了讓津津學習如何儲蓄,媽媽提出,津津可以隨時把整百的錢存在她那裏,到了年末她會加上20%還給津津。因此津津制定了一個儲蓄計劃:每個月的月初,在得到媽媽給的零花錢後,如果她預計到這個月的月末手中還會有多於100元或恰好100元,她就會把整百的錢存在媽媽那裏,剩余的錢留在自己手中。

   例如11月初津津手中還有83元,媽媽給了津津300元。津津預計11月的花銷是180元,那麽她就會在媽媽那裏存200元,自己留下183元。到了11月月末,津津手中會剩下3元錢。

   現在請你根據2004年1月到12月每個月津津的預算,判斷會不會出現這種情況。如果不會,計算到2004年年末,媽媽將津津平常存的錢加上20%還給津津之後,津津手中會有多少錢。

 

【輸入】
包括12行數據,每行包含一個小於350的非負整數,分別表示1月到12月津津的預算。

【輸出】
只包含一個整數。如果儲蓄計劃實施過程中出現某個月錢不夠用的情況,輸出
-X,X表示出現這種情況的第一個月;否則輸出到2004年年末津津手中會有多少錢。 【輸入樣例】 290 230 280 200 300 170 340 50 90 80 200 60 【輸出樣例】 -7 【提示】 【[樣例2】 輸入: 290 230 280 200 300 170 330 50 90 80 200 60 輸出: 1580
原題描述
#include<iostream>
using namespace std;
int main()
{
    int n=0,x,s=0,a,b=0,y=1;
	for(int i=1;i<=12;i++)	
	{	
		cin>>x;
		n=n+300-x;
		if(n>=0) 
		{		
			s+=n/100*100;
			n%=100;
		}
		else if(y) 
			 {
				b=i;
				y=0;
			 }	
	}
	a=s*1.2+n;
	if(y)
		cout<<a;	
	else
		cout<<-b;
	return 0;
}
這是學生寫的代碼,當然這個代碼可以優化、簡化,但邏輯大體沒錯。樣例也能順利通過,提交到網站就4個點對,6個點答案錯誤。錯誤在哪呢?還真不容易找。
其實在雙精度部分也應該有這種情況,但這個題沒有雙精度,所以不容易想到。
是它的錯:a=s*1.2+n!

在計算過程中,有1.2的出現,把整個運算式子的數據類型轉換為了float,而float可能會出現偏差,雖然很小(可能是-12數量級),但一取整存回a時就可能少了1。於是出現答案錯誤,找到原因了,改正就很容易了,加上0.1可以,把*1.2改為*6/5也可以了。

一本通1074:津津的儲蓄計劃