📜  以2的幂为负数的前N个自然数的总和

📅  最后修改于: 2021-04-21 21:54:25             🧑  作者: Mango

给定一个数字N(可能高达10 ^ 9)。任务是找到以2的幂为负数的前N个自然数的总和。
例子:

Input: N = 4
Output: -4
- 1 - 2 + 3 - 4 = -4
1, 2, and 4 are the powers of two.

Input: N = 5
Output: 1

方法:一种有效的解决方案是将两个的幂存储在一个数组中,然后将该数组的求和存储在另一个数组中。该数组的大小最多可以为30。因此,通常在功率数组中搜索大于给定数字的第一个元素。
下面是上述方法的实现:

C++
// C++ implementation of above approach
#include 
using namespace std;
 
// to store power of 2
int power[31];
 
// to store presum of the power of 2's
int pre[31];
 
// function to find power of 2
void PowerOfTwo()
{
    // to store power of 2
    int x = 1;
    for (int i = 0; i < 31; i++) {
        power[i] = x;
        x *= 2;
    }
 
    // to store pre sum
    pre[0] = 1;
    for (int i = 1; i < 31; i++)
        pre[i] = pre[i - 1] + power[i];
}
 
// Function to find the sum
int Sum(int n)
{
    // first store sum of
    // first n natural numbers.
    int ans = n * (n + 1) / 2;
 
    // find the first greater number than given
    // number then minus double of this
    // from answer
    for (int i = 0; i < 31; i++) {
        if (power[i] > n) {
            ans -= 2 * pre[i - 1];
            break;
        }
    }
 
    return ans;
}
 
// Driver code
int main()
{
    // function call
    PowerOfTwo();
 
    int n = 4;
 
    // function call
    cout << Sum(n);
 
    return 0;
}


Java
// Java implementation of above approach
import java.io.*;
 
class GFG {
     
 
// to store power of 2
static int power[] = new int[31];
 
// to store presum of the power of 2's
static int pre[] = new int[31];
 
// function to find power of 2
static void PowerOfTwo()
{
    // to store power of 2
    int x = 1;
    for (int i = 0; i < 31; i++) {
        power[i] = x;
        x *= 2;
    }
 
    // to store pre sum
    pre[0] = 1;
    for (int i = 1; i < 31; i++)
        pre[i] = pre[i - 1] + power[i];
}
 
// Function to find the sum
static int Sum(int n)
{
    // first store sum of
    // first n natural numbers.
    int ans = n * (n + 1) / 2;
 
    // find the first greater number than given
    // number then minus double of this
    // from answer
    for (int i = 0; i < 31; i++) {
        if (power[i] > n) {
            ans -= 2 * pre[i - 1];
            break;
        }
    }
 
    return ans;
}
 
// Driver code
    public static void main (String[] args) {
         
    // function call
    PowerOfTwo();
 
    int n = 4;
 
    // function call
    System.out.println( Sum(n));
    }
}
 // This code is contributed by ajit


Python 3
# Python 3 implementation of
# above approach
 
# to store power of 2
power = [0] * 31
 
# to store presum of the
# power of 2's
pre = [0] * 31
 
# function to find power of 2
def PowerOfTwo():
 
    # to store power of 2
    x = 1
    for i in range(31):
        power[i] = x
        x *= 2
 
    # to store pre sum
    pre[0] = 1
    for i in range(1, 31):
        pre[i] = pre[i - 1] + power[i]
 
# Function to find the sum
def Sum(n):
     
    # first store sum of
    # first n natural numbers.
    ans = n * (n + 1) // 2
 
    # find the first greater number
    # than given number then minus
    # double of this from answer
    for i in range( 31) :
        if (power[i] > n):
            ans -= 2 * pre[i - 1]
            break
 
    return ans
 
# Driver code
if __name__ == "__main__":
     
    # function call
    PowerOfTwo()
 
    n = 4
 
    # function call
    print(Sum(n))
 
# This code is contributed
# by ChitraNayal


C#
// C# implementation of
// above approach
using System;
class GFG
{
     
// to store power of 2
static int[] power = new int[31];
 
// to store presum of the
// power of 2's
static int[] pre = new int[31];
 
// function to find power of 2
static void PowerOfTwo()
{
    // to store power of 2
    int x = 1;
    for (int i = 0; i < 31; i++)
    {
        power[i] = x;
        x *= 2;
    }
 
    // to store pre sum
    pre[0] = 1;
    for (int i = 1; i < 31; i++)
        pre[i] = pre[i - 1] + power[i];
}
 
// Function to find the sum
static int Sum(int n)
{
    // first store sum of
    // first n natural numbers.
    int ans = n * (n + 1) / 2;
 
    // find the first greater number
    // than given number then minus
    // double of this from answer
    for (int i = 0; i < 31; i++)
    {
        if (power[i] > n)
        {
            ans -= 2 * pre[i - 1];
            break;
        }
    }
 
    return ans;
}
 
// Driver code
public static void Main ()
{
     
    // function call
    PowerOfTwo();
     
    int n = 4;
     
    // function call
    Console.WriteLine(Sum(n));
}
}
 
// This code is contributed
// by anuj_67


PHP
 $n)
        {
            $ans -= 2 * $pre[$i - 1];
            break;
        }
 
    return $ans;
}
 
// Driver code
 
// function call
PowerOfTwo();
 
$n = 4;
 
// function call
print(Sum($n));
 
// This code is contributed by mits
?>


Javascript


输出:
-4