我正在尝试将int的向量转换为int。这就是我的工作方式:
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
uint32_t toInt(vector<int> v)
{
uint32_t x=0;
for(int i=0 ; i<v.size() ; i++)
x+=v[i]*pow(10, v.size()-1-i);
return x;
}
int main()
{
vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
cout << toInt(v) << endl; // displays: 123456787 (???)
}
该程序应输出123456789,但我有12345678(!)7(!)。
我在Code :: Blocks 13.12上使用 GCC(tdm-1)4.7.1
有人对此问题有解释,并有解决方法吗? 谢谢。
答案 0 :(得分:4)
我无法想象它会导致您引用的问题,但是您进行转换的方式非常难看,涉及浮点数学,所以它可能导致某些程度的某些程度的不准确例。
您可以通过略微不同的方式消除该特定问题。例如:
int toInt(vector<int> const &v) { // pass by reference to avoid copying
int ret = 0;
for (int i=0; i<v.size(); i++)
ret = 10 * ret + v[i];
return ret;
}
或者,您可以使用标准库为您处理更多工作:
int toInt(vector<int> const &v) { // pass by reference to avoid copying
return std::accumulate(v.begin(), v.end(),
0,
[](int v, int digit) { return 10 * v + digit; });
}
当然,这仍然限于适合int
的值 - 例如,对于典型的32位int
,大约需要20亿。
答案 1 :(得分:1)
这个我无法重现的确切原因,但一个简单的解决方案是不使用pow
:
#include <iostream>
#include <vector>
uint32_t toInt(std::vector<int> v)
{
uint32_t x=0;
for(size_t i=0 ; i<v.size() ; i++)
{
x*=10;
x+=v[i];
}
return x;
}
int main()
{
std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::cout << toInt(v) << std::endl;
}
pow
pow
旨在计算浮点数的幂,因此它会做一些复杂而昂贵的事情。如果你只是将整数的幂加到整数,那么乘法几乎总是更快。
pow
和std::pow
略有不同。 std::pow
是一个模板化的野兽,最终会调用pow
,但只有在使用输入数据类型播放游戏后才会导致奇怪的结果。举个例子,这个提问者遇到了什么:C++ pow unusual type conversion
这只是using namespace std;
可以为您提供的众多方式之一。您可能对编译器选择的pow
感到惊讶。在此处阅读更多内容:Why is "using namespace std" considered bad practice?
答案 2 :(得分:0)
您的代码在我的计算机上正常运行
uint32_t toInt(vector<int> v)
{
uint32_t x=0;
for(int i=0 ; i<v.size() ; i++)
x+=v[i]*pow(10, v.size()-1-i);
return x;
}
int main(){
int myints[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
vector<int> v (myints, myints + sizeof(myints) / sizeof(int) );
cout << toInt(v) << endl;
}
执行如下:
./测试 123456789 退出代码:0
这台计算机已经老了并运行了c ++ 98,但我没有看到你的程序无法正常工作的原因。检查你的记忆是否有溢出。