高值整数的难度

时间:2018-08-17 14:47:28

标签: c++

好吧,我遇到了一个奇怪的问题。 我的任务是打印最小的三个数字对,它们的最大公约数在[0-N],N范围内最大,由用户提供。 我的代码非常适合大量数字,但我认为它无法处理很大的值。

这是我的代码:

#include<iostream>
using namespace std;
int main()
{   

long long  n; // THE RANGE 
long long  t; // THE NUMBER OF TEST CASES.
cin>>t; 
for(long long  i=0; i <t ; i++)
  {   cin>>n;
      if(n<3)
      {
          cout<<"-1"<<endl;
      }
       long long  gcd=0;    //GREATEST COMMON DIVISOR .
      if(n>=3)
      {
      for(long long  j=1 ; j<=n ;j++  )
      {   long long  cool=0;
          for(long long  k=j; k<=n; k++)
          {
              if(k%j==0)
              {
                  cool++;
              }
          }
          if(cool>=3)
          {
               gcd=j;
          }
      }
      cout<<endl;
      long long  count=0;
      for(long long  l= 1 ; l<=n ;l++)
        {
          if(l%gcd==0)
          {   cout<<l<<" ";
              count++;
          }
          if(count==3)
          {
              break;
          }
        }
      }

  }

return 0;
}

尽管我使用了很长很长的时间,但是它无法处理15位数字的输入。感激不尽。例如:

33333407 66666814 100000221 170438383717 340876767434 511315151151 151827062727 303654125454 455481188181 50606060603 101212121206 151818181809 770506172727 1541012345454 2311518518181 17172705050 34345410100 51518115150 4050572729393 8101145458786 12151718188179 5050606060 10101212120 15151818180 5050628283 10101256566 15151884849 184050508505050 368101017010100 552151525515150

1 个答案:

答案 0 :(得分:1)

我认为您的运行时间过长。查看您的代码:

for(long long j=1 ; j<=n ;j++ )
{ 
    long long cool=0; 
    for(long long k=j; k<=n; k++) 
    { 
        if(k%j==0) { cool++; }
    }

这有什么复杂性?如果n = 1,000,000,000,那么它将运行内部块多少次:

if(k%j==0) { cool++; }

我的建议是找到一种O(1)方式来获得与不循环相同的结果:

long long cool=0; 
for(long long k=j; k<=n; k++) 
{ 
   if(k%j==0) { cool++; }
}

您还有其他效率低下的问题,这仍然会使您的代码运行缓慢。对于15位数字,即使O(n)也太慢。弄清楚如何避免遍历所有n值。您有两个这样的循环,必须将其替换或提早终止。