Description
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了s元。 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
Input
输入数据有多组,每组占一行,包含小明买东西花的总钱数s。
Output
每行一组数据,输出小明买了多少罐啤酒。
Sample Input
82.3
Sample Output
11
HINT
注意:答案有可能不是一个,输出所有啤酒数比饮料少的情况。并且结果的每个数占一行,从小到大输出。
#include <iostream>
using namespace std;
int main()
{
double s;
int i,n;
while(cin>>s)
{
for(n=0; (int) n<=s/1.9; n++)
{
for(i=0; i<n; i++)
{
if((2.3*i+n*1.9-s)<=(1e-8)&&(2.3*i+n*1.9-s)>=-(1e-8))
{
cout<<i<<endl;
}
}
}
}
return 0;
}
总结几点:
0. float占4byte,精度是6~7位;double占8byte,精度是15~16位。
1. 因为double类型或float类型都是有精度的,其实都是取的近似值,所以有个误差。和一个很小的数比如0.00000001(1e-8)比较就是为了在这个误差范围内进行比较。
举个例子如double b = 0.123456可能是0.1234561的四舍五入后得到的结果。最后的0.0000001就表示误差范围了。
无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式 。
double 与 0 比较: doubel a; if ( a>-0.000001 && a< 0.000001 )对。 而 if( a == 0 )不对!