push_back(value)自动减少1

问题描述 投票:1回答:2

请考虑以下代码:

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()上发生变化。

有人可以解释为什么会这样吗?

c++ stl implementation
2个回答
2
投票

问题在于使用pow。您应该将结果存储为浮点数或双精度数,因为直接存储到int中会导致不精确。这看似奇怪的行为is well known。此行为似乎因您的编译器而异。

要解决此问题,请将vector<int> summ更改为vector<float> summdouble。或者,创建一个临时的floatdouble变量,然后在完成计算后将其放入向量中。


0
投票

在该行:

    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);

© www.soinside.com 2019 - 2024. All rights reserved.