push_back(value)自动减1

push_back(value) is automatically reduced by 1

考虑以下代码:

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

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

行中:

    cout << (n % 10) * pow(10, i) << " ";

您正在打印一个 double 值:整数 (n % 10) 被转换为 double 因为 pow() 函数returns一个double.

然而,在行中:

    summ.push_back((n % 10) * pow(10, i));

计算值(也是一个double)被截断到一个int然后被放入向量,因为您已将其声明为 std::vector<int>.

因此,如果计算出的 double 甚至分钟 小于预期 'integral' 值。 (请参阅:Strange behaviour of the pow function。)以全精度打印计算值将告诉您是否确实如此:

    cout << std::setprecision(20) << std::fixed << (n % 10) * pow(10, i) << " ";
在这种情况下,

A 'quick fix' 是将 0.5 添加到计算值 之前 它被截断并推送:

    summ.push_back((n % 10) * pow(10, i) + 0.5);

问题出在 pow 的使用上。您应该将结果存储为 float 或 double,因为直接存储到 int 会导致不精确。这种看似奇怪的行为。此行为似乎因您的编译器而异。

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