ttyy2018717
ttyy2018717
采纳率3.7%
2015-08-15 03:27

运行程序时会出现停止工作的提示是怎么回事?

#include
using namespace std;
#include
const int prime[]={10,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,91,97};
int main()
{
mpz_t N,temp,p,a,b,temp1,temp2,temp3,k,chosennum,sqrtnum,P,Q; //mpz_t 为GMP内置大数类型
mpz_init(N); //大数t使用前要进行初始化,以便动态分配空间
mpz_init(temp);
mpz_init(temp1);

mpz_init(temp2);

mpz_init(temp3);

mpz_init(p);
mpz_init(a);
mpz_init(b);
mpz_init(P);
mpz_init(Q);
//mpz_init(k);
mpz_init(chosennum);
mpz_init(sqrtnum);
mpz_ui_pow_ui(chosennum,2,20); //设定比较值。2^40
int perfect_square(mpz_t N); //判断完全平方数
cout<<"输入N:";
//mpz_set(N,);
gmp_scanf("%Zd",N); //输入待分解数
gmp_printf("%Zd\n",N);
int i=1;
int j=1;
int flag;
mpz_set(temp,N);
while(i<=200) //模式1算法
{
//mpz_set(N,temp);
j=1;
for(j=1;j<=i;j++)
mpz_mul_ui(N,N,j);
mpz_sqrt(p,N);
mpz_mod(b,N,p);
mpz_sub(temp1,N,b);
mpz_mul(temp2,p,p);
mpz_sub(temp3,temp1,temp2); //求出参数a,b,p
mpz_cdiv_q(a,temp3,p);
//gmp_printf("p=%Zd\n",p);
//gmp_printf("b=%Zd\n",b);gmp_printf("a=%Zd\n",a);
mpz_init(k);
mpz_set(N,temp);
while(mpz_cmp(chosennum,k))
{
mpz_add(temp1,a,k);
mpz_mul(temp2,temp1,temp1);
mpz_mul(temp3,k,p);
mpz_sub(temp3,b,temp3);
mpz_mul_ui(temp3,temp3,4);
mpz_sub(sqrtnum,temp2,temp3);
//gmp_printf("sqrtnum=%Zd\n",sqrtnum);
flag=perfect_square(sqrtnum);
//if(flag==0)cout<<"不是完全平方数";
if(flag>0)
{
//gmp_printf("sqrtnum=%Zd\n是完全平方数",sqrtnum);
mpz_sqrt(temp1,sqrtnum);
mpz_add(temp2,a,k);
mpz_neg(temp2,temp2);
mpz_add(temp1,temp1,temp2);
mpz_cdiv_q_ui(temp1,temp1,2);
mpz_sub(P,p,temp1);
mpz_gcd(P,P,N);
//if(mpz_cmp_ui(P,1))
//gmp_printf("P=%Zd\n",P);

            mpz_sqrt(temp1,sqrtnum);
            mpz_add(temp2,a,k);
            mpz_neg(temp2,temp2);
            mpz_sub(temp1,temp2,temp1);
            mpz_cdiv_q_ui(temp1,temp1,2);
            mpz_sub(Q,p,temp1); 
            mpz_gcd(Q,Q,N);
            if(mpz_cmp_ui(Q,1)&&mpz_cmp_ui(P,1))

            {gmp_printf("P=%Zd ",P);
            gmp_printf("Q=%Zd ",Q);
            return 0;}

            //return 0;
        }
        mpz_add_ui(k,k,1);
    }

        i++;
    }
mpz_clear(N);
mpz_clear(temp);
mpz_clear(p);
mpz_clear(a);
mpz_clear(b);
mpz_clear(k);
mpz_clear(temp1);
mpz_clear(temp2);
mpz_clear(temp3);
mpz_clear(chosennum);
mpz_clear(sqrtnum);
mpz_clear(P);
mpz_clear(Q);
//mpz_clear();
return 0;

}

int perfect_square(mpz_t N) //判断是否为完全平方数
{
int i=0,k,j;
int temp;
int flag;
while(i<23)
{
k=prime[i]/2+1;
int array=new int[k];
for(j=0;j<k;j++)
array[j]=((j+1)
(j+1))%prime[i];
//temp=N1%prime[i];
temp=mpz_fdiv_ui(N,prime[i]);
j=0;
flag=0;
while(j<k)
{
if(array[j]==temp) flag++;
j++;
}
if(flag==0) return 0;
i++;
}
return 1;

}
请问这段代码有什么错误 ?用VC++6.0编的,为什么输入99982642135860264139,运行后会出现**.exe已停止工作, 是怎么回事啊?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • oyljerry oyljerry 6年前

    设置断点,运行一下,跟踪找到具体代码函数。

    点赞 2 评论 复制链接分享

相关推荐