2010年8月5日

2010年8月5日
今天很忙,感觉有点力不从心。
花旗杯显得有些不太把握,总感觉在两周之内很难完成,技术难点太多。
如何实现任务的周期时执行;
如何设计页面;
关键算法又如何实现;
这些都是值得考虑的。
最近在看《C++ Primer 第四版》,看完第一章才发现以前的那点C++知识就只能证明自己知道C++的存在。
今天在自己机子上实验成功了SVN在不同局域网的使用,算是一点小成绩。
开始在交大的网站上做新手题了,昨天做的第一题,找零钱问题,结果又是在bbs上发帖,又是在网上搜资料,最后还是靠同学的代码才被accept。
不多说了,上代码,分析一下。
#include < iostream.h >

int  main()
{
    
float  a[ 8 ] = { 100 , 50 , 20 , 10 , 5 , 1 , 0.5 , 0.1 };
    
float  sum;
    
while (cin >> sum)
    {    
        
int  count = 0 ,i;
        sum
= sum + 0.001 ;
        
for (i = 0 ;i < 8 ;i ++ )
        {
            
while (sum >= a[i])
            {
                sum
-= a[i];
                count
++ ;
            }
        }
        cout
<< count << endl;
    }
    
return   0 ;
}
这个题用贪心算法,不难求解。我的疑惑主要有两点:
首先,我在网上搜到一种利用除法和模来计算找零张数的,结果提交上去是wrong answer ,很无语,本来我还感觉比减法要快。
然后就是浮点数比较时经常会出错,所以代码中有个+0.001的小技巧,值得借鉴。
/////////////////////////////////////////////////////
2010年8月7日
根据bbs上题目原作者的提醒,意识到上面提到的解法出现wrong answer的原因在于浮点数的计算误差。修改后代码如下:
 1  #include < iostream >  
 2  using   namespace  std; 
 3 
 4  int  a[ 8 ] = { 1000 , 500 , 200 , 100 , 50 , 10 , 5 , 1 }; 
 5 
 6  int  main() 
 7 
 8  double  sum; 
 9  int  i,count,temp; 
10  while (cin >> sum) 
11  {    
12  sum *= 10
13  temp = ( int )(sum + 0.1 ); 
14  count = 0
15  for (i = 0 ;i < 8 ;i ++
16 
17  count += temp / a[i]; 
18  temp %= a[i]; 
19 
20  cout << count << endl; 
21 
22 
23  return   0
24 
第13行中double型的变量sum转为int型的temp之前,要加上0.1,这样就可以被accpet。

你可能感兴趣的:(2010年8月5日)