好吧,我遇到了一个奇怪的问题。 我的任务是打印最小的三个数字对,它们的最大公约数在[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
答案 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
值。您有两个这样的循环,必须将其替换或提早终止。