Algorithm 对于这个LCM问题有更好的解决方案吗?
假设我们得到了一个正整数NAlgorithm 对于这个LCM问题有更好的解决方案吗?,algorithm,math,Algorithm,Math,假设我们得到了一个正整数N2求LCM最小的a,B与求GCD最大的a,B是一样的。最大可能的GCD是N的最大因子(不包括N本身) 如果K是N的最大因子,那么A=K,B=K*(N/K-1)是一个解。所有解决方案的形式为A=jK,B=K(N/K-j),其中1使用上述方法由@Paul Hankin最终得出一个解决方案,非常感谢 C++14解决方案 ll n,A,B; cin >> n; // long long if( n % 2 == 0 ) { A = n/2 ; B =
2求LCM最小的a,B与求GCD最大的a,B是一样的。最大可能的GCD是N的最大因子(不包括N本身)
如果K是N的最大因子,那么A=K,B=K*(N/K-1)是一个解。所有解决方案的形式为A=jK,B=K(N/K-j),其中1使用上述方法由@Paul Hankin
最终得出一个解决方案,非常感谢
C++14解决方案
ll n,A,B; cin >> n; // long long
if( n % 2 == 0 ) { A = n/2 ; B = n/2 ; }
else if(isprime(n)) { A = 1 ; B = n-1 ; }
else
{
ll K;
for(ll i = 3; i <= sqrt(n) ; i++ )
{
if( n % i == 0) { K = n/i ; break; }
}
A = K, B = n-K;
}
ll n,A,B;cin>>n;//长长的
如果(n%2==0){A=n/2;B=n/2;}
else如果(isprime(n)){A=1;B=n-1;}
其他的
{
ll K;
例如,我相信简单的数学
你给的提示很重要
案例1:
如果N是偶数=>A=N/2,B=N/2
案例2:
如果N是素数=>A=1,B=N-1
案例3:
如果N是奇数=>这很棘手
现在,如果A+B=N
,则A的最大可能值(考虑到A,这反过来又将最大(A,B)=B最小化
如果我们想最小化B,我们需要最大化A(从等式(4))
为了最大化A,我们需要最小化(d+1)
因此,(d+1)=d=N的最小因子,其中(d)>=3,d=d-1
最终答案,A=N/(d+1)和B=d*A
请查看以下已接受对代码力的判断的实现:
#include <iostream>
#include <string>
#include <cmath>
typedef long long int LL;
bool isPrime(LL n)
{
for(LL i = 2 ; i <= sqrt(n) ; i++ )
if(n%i==0)return false;
return true;
}
int main()
{
int t;
std::cin >> t;
while(t--){
LL n, A, B;
std::cin>>n;
if( n % 2LL == 0 ) {
A = n/2LL ;
B = n/2LL ;
}
else if(isPrime(n)) {
A = 1LL ;
B = n-1LL ;
}
else{
LL D;
for(LL i = 3; i <= sqrt(n) ; i++ )
{
if( n % i == 0) {
D = i;
break;
}
}
LL d = D - 1LL;
A = n/(d+1LL);
B = d*A;
}
std::cout<<A<<" "<<B<<std::endl;
}
return 0;
}
#包括
#包括
#包括
typedef long long int LL;
bool isPrime(LL n)
{
对于(LL i=2;i>t;
而(t--){
LL n,A,B;
标准:cin>>n;
如果(n%2LL==0){
A=n/2LL;
B=n/2LL;
}
else if(isPrime(n)){
A=1升;
B=n-1LL;
}
否则{
法学博士;
对于(LL i=3;我可以提供问题原始问题链接的参考-投票关闭,因为这是一个数学问题-不是编程。当你说“找到LCM最低的a,B与找到GCD最大的a,B相同”,您是否忽略了这样一个事实,即乘积AB
在所有对A
,B
上都以固定和变化?例如,如果N=25
,A=10
和B=15
不是一个解决方案,因为它给出的LCM比A=5
和B=20
大,我认为是的你是对的。我想删除我的答案,但它被接受了。我认为你的答案是正确的(除了“所有解的形式都是…”位之外,A=K
,B=K*(N/K-1)
是一个解)。而不是sqrt(N)的浮点数学的不精确性< /代码>并可能重新计算平方根,考虑<代码>(LL i=2;i为什么在<代码> n% 2=0 >中不必要的<代码> LL>代码>?
#include <iostream>
#include <string>
#include <cmath>
typedef long long int LL;
bool isPrime(LL n)
{
for(LL i = 2 ; i <= sqrt(n) ; i++ )
if(n%i==0)return false;
return true;
}
int main()
{
int t;
std::cin >> t;
while(t--){
LL n, A, B;
std::cin>>n;
if( n % 2LL == 0 ) {
A = n/2LL ;
B = n/2LL ;
}
else if(isPrime(n)) {
A = 1LL ;
B = n-1LL ;
}
else{
LL D;
for(LL i = 3; i <= sqrt(n) ; i++ )
{
if( n % i == 0) {
D = i;
break;
}
}
LL d = D - 1LL;
A = n/(d+1LL);
B = d*A;
}
std::cout<<A<<" "<<B<<std::endl;
}
return 0;
}