📌  相关文章
📜  检查一个数字是否可以表示为2个三角数之和

📅  最后修改于: 2021-04-26 05:25:42             🧑  作者: Mango

给定一个整数N ,任务是找出它是否可以写成2个三角数之和(可能不同,也可能不同)。
例子:

Input: N = 24
Output: YES
24 can be represented as 3+21.

Input: N = 15
Output: NO

方法:
考虑所有小于N的三角数,即sqrt(N)数。让我们将它们添加到集合中,对于每个三角数X,我们检查集合中是否存在NX 。如果对于任何三角数都为真,则答案为是,否则答案为否。
以下是上述方法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
 
// Function to check if it is possible or not
bool checkTriangularSumRepresentation(int n)
{
    unordered_set tri;
    int i = 1;
 
    // Store all triangular numbers up to N in a Set
    while (1) {
        int x = i * (i + 1) / 2;
        if (x >= n)
            break;
        tri.insert(x);
        i++;
    }
  
    // Check if a pair exists
    for (auto tm : tri)
        if (tri.find(n - tm) != tri.end())
            return true;
    return false;
}
 
// Driver Code
int main()
{
    int n = 24;
    checkTriangularSumRepresentation(n) ? cout << "Yes"
                                        : cout << "No";
 
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
 
class GFG
{
 
    // Function to check if it is possible or not
    static boolean checkTriangularSumRepresentation(int n)
    {
        HashSet tri = new HashSet<>();
        int i = 1;
 
        // Store all triangular numbers up to N in a Set
        while (true)
        {
            int x = i * (i + 1) / 2;
            if (x >= n)
            {
                break;
            }
            tri.add(x);
            i++;
        }
 
        // Check if a pair exists
        for (Integer tm : tri)
        {
            if (tri.contains(n - tm) && (n - tm) !=
                (int) tri.toArray()[tri.size() - 1])
            {
                return true;
            }
        }
        return false;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int n = 24;
        if (checkTriangularSumRepresentation(n))
        {
            System.out.println("Yes");
        }
        else
        {
            System.out.println("No");
        }
    }
}
 
// This code has been contributed by 29AjayKumar


Python 3
# Python3 implementation of the above approach
 
# Function to check if it is possible or not
def checkTriangularSumRepresentation(n) :
     
    tri = list();
    i = 1;
 
    # Store all triangular numbers
    # up to N in a Set
    while (1) :
        x = i * (i + 1) // 2;
        if (x >= n) :
            break;
             
        tri.append(x);
        i += 1;
 
    # Check if a pair exists
    for tm in tri :
        if n - tm in tri:
            return True;
             
    return False;
 
# Driver Code
if __name__ == "__main__" :
    n = 24;
     
    if checkTriangularSumRepresentation(n) :
        print("Yes")
    else :
        print("No")
 
# This code is contributed by Ryuga


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
    // Function to check if it is possible or not
    static bool checkTriangularSumRepresentation(int n)
    {
        HashSet tri = new HashSet();
        int i = 1;
 
        // Store all triangular numbers up to N in a Set
        while (true)
        {
            int x = i * (i + 1) / 2;
            if (x >= n)
            {
                break;
            }
            tri.Add(x);
            i++;
        }
 
        // Check if a pair exists
        foreach (int tm in tri)
        {
            if (tri.Contains(n - tm))
            {
                return true;
            }
        }
        return false;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int n = 24;
        if (checkTriangularSumRepresentation(n))
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}
 
// This code contributed by Rajput-Ji


PHP
= $n)
            break;
             
        array_push($tri, $x);
        $i += 1;
    }
     
    // Check if a pair exists
    foreach($tri as $tm)
        if (in_array($n - $tm, $tri))
            return true;
             
    return false;
}
 
// Driver Code
$n = 24;
 
if (checkTriangularSumRepresentation($n))
    print("Yes");
else
    print("No");
 
// This code is contributed by mits
?>


C++
// C++ implementation of the above approach
#include 
using namespace std;
#define ll long long
int main()
{
    ll n;
    cin >> n;
    ll dig = 2 * n;
    bool flag= 0;
    for (ll i = 1; i < sqrt(2 * n + 1); i++) {
        if (i * i + i > dig)
            break;
        ll rest = dig - i * i - i;
        ll left = 1;
        ll right = dig;
        while (left <= right) {
            ll mid = (left + right) / 2;
            if (mid * mid + mid > rest)
                right = mid - 1;
            else if (mid * mid + mid == rest) {
                flag = 1;
                break;
            }
            else
                left = mid + 1;
        }
        if (flag)
            break;
    }
    if (flag)
        cout<<"YES"<


输出:
Yes

时间复杂度: O(Sqrt(N))

第二种方法:很清楚N是正数,因为三角数是可表示为k *(k + 1)/ 2的数,其中k是某个正整数,由此我们还得到每个项都小于N。这意味着我们采用并迭代其他术语之一。如果我们以递增顺序遍历第一项,则可以使用两个指针,这给了我们O(Sqrt(N))的解决方案。

C++

// C++ implementation of the above approach
#include 
using namespace std;
#define ll long long
int main()
{
    ll n;
    cin >> n;
    ll dig = 2 * n;
    bool flag= 0;
    for (ll i = 1; i < sqrt(2 * n + 1); i++) {
        if (i * i + i > dig)
            break;
        ll rest = dig - i * i - i;
        ll left = 1;
        ll right = dig;
        while (left <= right) {
            ll mid = (left + right) / 2;
            if (mid * mid + mid > rest)
                right = mid - 1;
            else if (mid * mid + mid == rest) {
                flag = 1;
                break;
            }
            else
                left = mid + 1;
        }
        if (flag)
            break;
    }
    if (flag)
        cout<<"YES"<

输出:

YES

时间复杂度:O(Sqrt(N))