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> summ
或 double
。或者,创建一个临时 float
或 double
变量,然后在计算完成后将其放入向量中。
考虑以下代码:
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> summ
或 double
。或者,创建一个临时 float
或 double
变量,然后在计算完成后将其放入向量中。