程序中止 - 从文件读取的数字的主要因素

时间:2015-12-15 19:39:24

标签: c++ memory backtracking

此代码将数字分解为其主要因子。

数字来自文件。文件中的第一个数字表示其中的元素数量,数字来自区间[1,10 ^ 18]。

代码的问题在于,在读取并分解一些数字后,它会停止。它旨在分解100到1000个数字,其中至少有一个数字大于10 ^ 9。

我怀疑堆栈溢出,但我不是100%肯定。我想听听一些建议,以解决这个内存分配问题。 谢谢。

#include <iostream>
#include <stdio.h>

using namespace std;

void print_recurenta(int a,int i)
{
    if((a==1)||(i>a))
        return;
    if(a%i==0)
    {
        printf("%d  ",i);
        a=a/i;
        print_recurenta(a,i);
    }
    else
    {
        i++;
        print_recurenta(a,i);
    }
}

void factor_printf(int nr)
{
    printf("\n%ld  ",nr);
    int i=2;
    print_recurenta(nr,i);

}


int main()
{
    int numere;
    int  nr=0;
    FILE* f=fopen("input.txt","r");
    if(f==0)
        return -1;
    fscanf(f,"%d",&numere);
    while(fscanf(f,"%d",&nr)!=EOF)
    {
        fscanf(f,"%d",&nr);
        factor_printf(nr);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果我们在循环中寻找下一个因素,可以递归地解决 CAN 这个问题:

void print_recurenta(__int64 a, __int64 i)
{
    if (a == 1)
        return;

    if (i*i > a)
    {
        printf("%llu  ", a);
        return;
    }

    if (a%i == 0)
    {
        printf("%llu  ", i);
        a = a / i;
    }
    else
    {
        for (++i; i*i < a && (a%i != 0); ++i)
            ;
    }
    print_recurenta(a, i);
}