【问题标题】:finding the number of divisors don't know what is going wrong求除数不知道怎么回事
【发布时间】:2012-09-04 18:46:01
【问题描述】:

我正在编写代码以求两个数 n 和 k 的公约数个数。

我正在使用找到 GCD g 然后找到 GCD 的除数的方法来实现它。

但是代码编译但在运行时给出了一个没有响应的消息:(

我对此感到震惊.. 任何人都可以帮助调试.. 提前致谢

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>

using namespace std;

vector<bool>p(1000002,true);

long int getgcd(long int a, long int b)
{  if(b == 0)
          return a;
   else
          return getgcd(b, a % b);
}

void prime()
{   int i,j;
    for(i=2;i<1000001;i++)
      if(p[i])
        for(j=i*i;j<1000001;j=j+i)
             p[j]=false;
    p[0]=false;
    p[1]=false;
}

void divfind(long int a, long int b)
{
     long int g;
     g = getgcd(a,b);
     int i,s,j=0,ans=1,num=0;
     //short int fo[1000000];
     s=(int) sqrt(g);
     for(i=2;i<s+1;i++)
       if(p[i])
        {
          while(g%i==0)
          {g=g/i;
           num++;
          }
          if(num)
            ans*=++num;
          num=0;
        }
      printf("%d\n",ans);
}

int main()
{
    prime();
    long int n;
    int q;
    scanf("%ld %d",&n,&q);
    while(q--)
    {
        int t;
        long int k;
        scanf("%d%ld",&t,&k);
        if(t==1)
        divfind(n,k);
//        else if(t==2)
//       divi(n,k);
//        else
//        nodivi(n,k);
    }
    return 0;
}

【问题讨论】:

  • 不运行或不编译?如果它编译,那么它可能会运行......(不一定到你想要的最后)。
  • 它编译但不运行.. 具体来说它没有响应
  • 尝试删除divfind(),还是没有反应?
  • 你的代码worked fine on ideone
  • 即使在删除 divfind() 之后它也没有响应 在 ideone 上工作令人惊讶!因为它既不适用于 devcpp 也不适用于 codeblcoks

标签: c++ primes factorization


【解决方案1】:

您遇到了整数溢出 - i*i 仅在使用 32 位整数时才安全到 i=46340 (~2^15*sqrt(2)),例如:

i     i*i
46339 2147302921
46340 2147395600
46341 -2147479015
46342 -2147386332

这会导致未定义的行为。

【讨论】:

  • 有符号整数最多可以处理 20 亿个 (( 2^32-1 ) / 2)
  • @themel 非常感谢.. 它现在正在运行 :)
猜你喜欢
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多