我有以下代码来生成数字的素数因子。它除了一些以外的所有数字都能正常工作。我在这些数字中遇到的错误是运行时错误,它位于第5行和第10行,在尝试访问'因素' 数组时
以及为什么在访问'因素时不会出错?第15和18行的数组。 *这对于大于和小于48598496894的数字都是完美的,只是不适用于48598496894。
void getfactors(unsigned long long n){
unsigned long long *factors,i=0,k=0;
//array to store prime factors//
factors=(unsigned long long *)malloc(n*sizeof(unsigned long long));
//getting 2's which are factors of the number//
while(n%2==0){
factors[k++]=2; //line 5
n=n/2;
}
//getting other prime factors of the number//
for(i=3;i<=sqrt(n);i=i+2){
while(n%i==0){
factors[k++]=i; //line 10
n=n/i;
}
}
//last prime factor of number//
if(n>2)
factors[k++]=n; //line 15
printf("%d\n\n",k);
//printing all factors//
for(i=0;i<k;i++)
printf("%llu\n",factors[i]); //line 18
}
int main()
{
getfactors(48598496894);
return 0;
}
答案 0 :(得分:0)
如果分配失败,您应该在NULL
之后检查因素不是malloc
。您还需要调用free
以释放您在完成后分配的内存。如果您评论您的代码以解释您的预期行为,也会有所帮助。
要解决您的问题,我建议您在调试时检查数组索引。如果您使用较小的输入值,那么在您知道算法有效之前可能会更容易。
另一点是你是否需要因素数组?如果函数的目的是打印素数因子,你不能在找到它们时打印它们吗?
修改强>
我认为@BLUEPIXY在评论中暗示了这个问题。 malloc
的输入参数是size_t
。在我的PC上size_t
是32位值。如果您的平台上出现这种情况,那么您尝试分配的内存块的大小就太大了。检查是否(n*sizeof(unsigned long long)) > SIZE_MAX
。正如我之前提到的,您是否可以在找到它们时打印因子并取消数组?