#include <iostream>
#include <sstream>
#include <numeric>
#include <math.h>
using namespace std;
int64_t splitAdd(int64_t value) {
ostringstream intStream;
intStream << value;
string intString(intStream.str());
return accumulate(intString.begin(), intString.end(), 0) - (intString.size() * int64_t('0'));
}
int main(int argc, char *argv[]) {
int64_t maxPower = 50;
int64_t results[maxPower];
for (int64_t tuple = 0; tuple <= maxPower; tuple++) {
for(int64_t power = 0; power <= maxPower; power++) {
int64_t value = pow(tuple, power);
while (value > 9) {
value = splitAdd(value);
}
results[power] = value;
}
cout << tuple << endl;
for (int i = 0; i < maxPower; i++) {
cout << results[i] << ',';
}
cout << endl;
}
}
过了一会儿,我反复得到了值:-9223372036854775808。我也在Code Runner 2中运行它,不确定这是否会产生影响。
答案 0 :(得分:7)
一个明显的错误是:
int64_t maxPower = 50;
int64_t results[maxPower]; // <-- Not really legal, but let's pretend
//...
for (int64_t power = 0;
power <= maxPower; // <-- Look at the loop constraints
power++)
{
//....
}
results[power] = value; // <-- Buffer overrun
由于maxPower
为50,因此您正在访问超出范围的元素。这是未定义的行为
另外,要使代码合法C ++,要么声明一个50:
的数组int64_t results[50];
或声明std::vector<int64_t>
。
当您这样做并使用at()
代替[]
时,您可以更好地了解您的计划如何中断。请参阅the Live Example using std::vector here。
对于“奇数”,你在这里得到一个数字溢出:
int64_t value = pow(tuple, power);
如果tuple
为3,power
为41
,则值会溢出int64_t
类型。
也许您需要使用arbitrary precision library(最好是重载必需的数学运算符)或编写自己的,而不是使用“常规”C ++类型。那么你就不会或不应该溢出。