给定一个数字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