解决了!我发现了我的错误...我最后发布了我的解决方案。抱歉浪费时间。
我玩过c ++已经有一段时间了。它从来都不是我的主要语言,所以我不熟悉更精细的细节。我弹出一个奇怪的错误。当我调用factorize()时,它正在重置数字的符号。尽管标志永远不会被触及,但这是事实。
我找到了一个解决方法。在我的工作代码中,我添加了一个整数来保存和重置值,但我认为我不应该这样做。我从下面的代码示例中删除了这两行。
我重置标志的地方: sign由此类的构造函数设置为0。它可以在*和* =运算符中设置为0(如果它们各自具有相同的符号)。仅当为对象分配(无符号long long)值时,它才被=运算符设置为零(如果将符号设置为等于另一个FactorNumber,则保留符号)。
就是这样。这些是我设置为零的唯一地方。我不明白为什么这个功能会调用其中任何一个。但是,我并没有真正适应c ++在处理类时如何处理事情的细节。我不明白为什么签名会一直重置为0,但也许我做错了什么。有谁知道为什么会这样?
class FactorNumber {
private:
unsigned long long number;
unsigned long long factor_list[63]; // this is the max possible amount
int number_of_factors;
int sign; // 0=positive 1=negative
void factorize();
[snipped irrelevant public function calls]
};
void FactorNumber::factorize() {
int x=0;
for(x=0;x<64;x++) {
factor_list[x]=0;
}
number_of_factors=0;
unsigned long long current_factor=2; // 64 bits in c++
unsigned long long current_number=number;
unsigned long max_factor=0; // can never be more than 32 bits
if (number>3) {
max_factor=sqrt(current_number);
while (current_factor<=max_factor) {
if(current_number%current_factor) {
if(current_factor>2) {
current_factor+=2;
} else {
current_factor=3;
}
} else {
factor_list[number_of_factors++]=current_factor;
current_number=current_number/current_factor;
if(current_number%current_factor) {
max_factor=sqrt(current_number);
}
}
}
// If there is a number larger than one, add it to the array.
if(current_number>1) {
factor_list[number_of_factors]=current_number;
} else {
number_of_factors--; // If not, we ignore this last number
}
} else {
number_of_factors=0;
factor_list[0]=number;
}
}
我的错误是一个obiwan错误。我正在编写我的数组的末尾(factor_list [63]实际上并不存在),这是在覆盖我的数据。巧合的是,这个重置标志并没有搞砸其他东西(或许它确实如此,但我还没有抓住它)。这就是我问这个问题的原因。我无法解决这个问题,我知道我的代码中有一个错误。
将for循环条件更改为x <63可清除错误。
答案 0 :(得分:2)
你在for
的第一个factorize()
中溢出,因为你要到索引63,而最大索引(在类中声明为62(大小63))。实际上,每当你打电话给factor_list[X]=Y
时,你都有机会溢出课堂上的下一个成员。您总是需要验证数组索引!
unsigned long long factor_list[63]; // <----- indexes from 0 to 62
// <code omitted>
factor_list[666] = 0; // <----- Oops! Overflowing (but it's still valid code)
另外,为什么在C ++中使用C风格的数组而不是C ++风格的数组呢? std::array
是一种更好的方法。
答案 1 :(得分:1)
factor_list
中有63个项目。
此循环
for(x=0;x<64;x++) {
factor_list[x]=0;
}
写入64 long longs
。
最后一个赋值factor_list[63]
会覆盖存储在数组后面的变量,将sign
设置为0。
更改循环索引。
您可能还想添加一些不会增加number_of_factors
的检查。
答案 2 :(得分:0)
正如已经指出的那样,我正在编写我的数组的末尾。