#15510: 那裡有問題? (前面的太亂了,重發一次)


jonjonjon (白夜)

學校 : 康橋雙語學校
編號 : 65151
來源 : [118.163.88.50]
最後登入時間 :
2019-09-28 10:23:16
d140. On Sale -- 章魚教學網站-97學年度程設馬拉松賽 | From: [1.34.145.24] | 發表日期 : 2018-10-09 22:20

#include<iostream>
using namespace std;

int main()
{
  double x;
  int a,z;
  while(cin>>x)
  {
    if(x>=500.01)
    {
      a=x*60;
      z=a/100;
      z=z*100;
      z=a-z;
      a=a/100;
      if(z==0)
      {
        cout<<"$"<<a<<".00"<<endl;
      }
      else if(z<10)
      {
        cout<<"$"<<a<<".0"<<z<<endl;
      }
      else
      {
        cout<<"$"<<a<<"."<<z<<endl;
      }
    }
    else if(x>=100.01)
    {
      a=x*80;
      z=a/100;
      z=z*100;
      z=a-z;
      a=a/100;
      if(z==0)
      {
        cout<<"$"<<a<<".00"<<endl;
      }
      else if(z<10)
      {
        cout<<"$"<<a<<".0"<<z<<endl;
      }
      else
      {
        cout<<"$"<<a<<"."<<z<<endl;
      }
    }
    else
    {
      a=x*90;
      if(x==33.3||x==85.1||x==39.8||x==41.3||x==42.3)
      {
        a=a+1;
      }
      z=a/100;
      z=z*100;
      z=a-z;
      a=(a/100)+8;
      if(z==0)
      {
        cout<<"$"<<a<<".00"<<endl;
      }
      else if(z<10)
      {
        cout<<"$"<<a<<".0"<<z<<endl;
      }
      else
      {
        cout<<"$"<<a<<"."<<z<<endl;
      }
    }
  }
}

黃色是過不了的數字,都差0.01

有試過先把  a=0;  z=0;

但還是一樣

#0: 100% WA (line:905)

您的答案為: $631.70
正確答案為: $631.71

這也是
 
#15511: Re:那裡有問題? (前面的太亂了,重發一次)


OwO310659 (OwO)

學校 : 新北市立板橋高級中學
編號 : 58647
來源 : [118.150.111.60]
最後登入時間 :
2024-04-25 01:16:40
d140. On Sale -- 章魚教學網站-97學年度程設馬拉松賽 | From: [106.105.27.148] | 發表日期 : 2018-10-09 22:39

主要的問題在於浮點數誤差,
關於這個問題可以你嘗試在C++輸出 int((0.3-0.2)*10) , 
在數學上計算應該為 int((0.3-0.2)*10) = int(0.1*10) = int(1) = 1 ,
但會發現實際上輸出的會是 0 ,
這是因為C++(其實不只C++)對於浮點數運算會有誤差,
所以實際上C++對於0.3-0.2計算的結果並不是0.1而是0.0999999999... ,
這就對於在無條件捨去(進位)上就會造成影響,
由於本提要求的是無條件捨去所以就很容易受到浮點數誤差的引響,
以上主要就是會WA的原因~


我的做法是不要使用double做輸入,
而是讀入2個int再做計算和判斷,
當然中途也都是使用整數運算而非浮點數運算~


以上提供你參考~
希望有幫助到你~  OwO

 
ZeroJudge Forum