请考虑以下代码:
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int num,i,ct=0;
vector<int> summ;
i=0;
while(n)
{
if(n%10)
{
cout<<(n%10)*pow(10,i)<<" ";
summ.push_back((n%10)*pow(10,i)); ct++;
}
i++;
n=n/10;
}
cout<<'\n'<<ct<<'\n';
for(i=0;i<summ.size();i++)
{
cout<<summ[i]<<" ";
}
cout<<'\n';
}
如果输入以下内容:
1
555
产生的输出是5 50 500 3 5 50 499。
我不明白为什么数字在push_back()上发生变化。
有人可以解释为什么会这样吗?
问题在于使用pow
。您应该将结果存储为浮点数或双精度数,因为直接存储到int中会导致不精确。这看似奇怪的行为is well known。此行为似乎因您的编译器而异。
要解决此问题,请将vector<int> summ
更改为vector<float> summ
或double
。或者,创建一个临时的float
或double
变量,然后在完成计算后将其放入向量中。
在该行:
cout << (n % 10) * pow(10, i) << " ";
您正在打印double
值:整数 (n % 10)
转换为double
,因为pow()
函数返回了double
。
但是,在一行中:
summ.push_back((n % 10) * pow(10, i));
计算出的值(也是double
)在被放置到向量中之前,先将它[<< [截短设为int
,因为您已经声明它是std::vector<int>
。
double
甚至分钟小于预期的“积分”值,就会(偶尔)出现错误。 (请参阅:Strange behaviour of the pow function。)以实际精度打印计算所得的值将显示实际情况:
cout << std::setprecision(20) << std::fixed << (n % 10) * pow(10, i) << " ";
在这种情况下,“快速修复”是将0.5
添加到计算值之前,将其截断并推送:
summ.push_back((n % 10) * pow(10, i) + 0.5);