C++ Gcd在该代码中是如何工作的?
我试着解决一个关于黑客的问题,但我没能解决,所以我看了社论。他们只给出了代码,没有解释。你能解释为什么gcd在这里使用的逻辑吗 问题:C++ Gcd在该代码中是如何工作的?,c++,greatest-common-divisor,C++,Greatest Common Divisor,我试着解决一个关于黑客的问题,但我没能解决,所以我看了社论。他们只给出了代码,没有解释。你能解释为什么gcd在这里使用的逻辑吗 问题: int main() { int T; cin>>T; while(T--) { long long N,A,B; cin>>A>>B>>N; long long g=gcd(B,N); cout<<N/g<<endl; } return 0
int main()
{
int T;
cin>>T;
while(T--)
{
long long N,A,B;
cin>>A>>B>>N;
long long g=gcd(B,N);
cout<<N/g<<endl;
}
return 0;
}
史酷比和他的所有朋友都聚在一起参加聚会。有N个朋友在场。史酷比真的很高兴在一个地方看到他的所有朋友,并很兴奋地迎接他们
所有的N个朋友都坐在一个圆圈里,编号从0到N-1。史酷比最初坐在他的朋友旁边。在问候一位朋友后,他顺时针走到下一位朋友身边,坐在他旁边向他打招呼。他重复这个直到他回到朋友身边
在兴奋中,史酷比可能错过了与朋友的问候。你的工作是找到史酷比在回到A之前问候过的朋友(包括A)的数量
给出的解决方案:
int main()
{
int T;
cin>>T;
while(T--)
{
long long N,A,B;
cin>>A>>B>>N;
long long g=gcd(B,N);
cout<<N/g<<endl;
}
return 0;
}
intmain()
{
int T;
cin>>T;
而(T--)
{
长N,A,B;
cin>>A>>B>>N;
长g=gcd(B,N);
cout为了解释上述问题的解决方案,我将首先说明答案是-LCM(B,N)/B
,然后说明这如何等于N/GCD(B,N)
第一部分-
现在假设,当它按照上述步骤再次到达A
时,他会向f
朋友打招呼。(注意,通过上述过程打招呼的两个朋友不可能是同一个)。此外,假设当他到达A
时,他会绕圆圈转r
。
现在我们可以说-
f*B=r*N=C
让它等于某个常数C
。显然,C是B
和N
的倍数,而且,它是B
和N
的最小公倍数(LCM)。
因此f=LCM(B,N)/B
。注意f是他问候的朋友的数量,因此这是必需的答案。
第二部分-
对于两个正整数a
和b
及其GCD和LCMg
和l
,我们有以下关系-a*b=g*l
从上面的关系我们可以说-
LCM(B,N)*GCD(B,N)=B*N
=>LCM(B,N)/B=N/GCD(B,N)
最后我们得到了我们的答案=LCM(B,N)/B
=N/GCD(B,N)
欢迎使用堆栈溢出。请花时间阅读并参考“您可以在此处询问什么和如何提问”中的资料。解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,您应该逐行检查代码。要获得更多帮助,请阅读。至少,您应该将问题包含在e一个重现您的问题的示例,以及您在调试器中所做的观察。@πάνταῥεῖ 调试器如何帮助他理解为什么GCD在这段代码中工作?OP提到了解决方案代码,它的作用类似于MCV。你知道什么意思吗?我知道如何找到GCD,它的意思是什么,但它在这里是如何工作的?