Algorithm 对于这个LCM问题有更好的解决方案吗?

Algorithm 对于这个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 =

假设我们得到了一个正整数N
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;
}