Find if given number is sum of first n natural numbers
Given a number s (1 <= s <= 1000000000). If this number is the sum of first n natural number then print n, otherwise print -1.
Examples:
Input: s = 10
Output: n = 4
Explanation: 1 + 2 + 3 + 4 = 10
Input: s = 17
Output: n = -1
Explanation: 17 can’t be expressed as a sum of first n natural numbers as sum of first 5 natural numbers is 15 and sum of first 6 natural numbers is 21
Finding if given number is sum of first n natural numbers using Brute Force:
The idea is to keep adding numbers starting from 1 and if the sum of the numbers become equal to s, then return the count of numbers added so far. If the sum becomes greater than s, then return -1 as it is impossible to express s as sum of first n natural numbers.
Step by step approach:
- Maintain a variable sum = 0 to calculate the running sum of numbers.
- Iterate a loop from i = 1 to s
- Add i to sum
- If sum == s, return i
- Else if sum > s, return -1
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
int findS( int s)
{
int sum = 0;
for ( int i = 1; sum < s; i++) {
sum += i;
if (sum == s)
return i;
}
return -1;
}
int main()
{
int s = 15;
cout << findS(s);
return 0;
}
|
Java
class GFG {
static int findS( int s)
{
int sum = 0 ;
for ( int i = 1 ; sum < s; i++) {
sum += i;
if (sum == s)
return i;
}
return - 1 ;
}
public static void main(String[] args)
{
int s = 15 ;
System.out.println(findS(s));
}
}
|
Python3
def findS(s):
_sum = 0
i = 1
while (_sum < s):
_sum + = i
if _sum = = s:
return i
i + = 1
return - 1
s = 15
print (findS(s))
|
C#
using System;
class GFG {
static int findS( int s)
{
int sum = 0;
for ( int i = 1; sum < s; i++) {
sum += i;
if (sum == s)
return i;
}
return -1;
}
public static void Main()
{
int s = 15;
Console.WriteLine(findS(s));
}
}
|
Javascript
<script>
function findS(s) {
var sum = 0;
for (i = 1; sum < s; i++) {
sum += i;
if (sum == s)
return i;
}
return -1;
}
var s = 15;
document.write(findS(s));
</script>
|
PHP
<?php
function findS( $s )
{
$sum = 0;
for ( $i = 1; $sum < $s ; $i ++)
{
$sum += $i ;
if ( $sum == $s )
return $i ;
}
return -1;
}
$s = 15;
echo findS( $s );
?>
|
Time Complexity: O(√s), where s is the number we need to check as the sum of first n natural numbers
Auxiliary Space: O(1)
Finding if given number is sum of first n natural numbers using Mathematical formula:
The idea is to use the formula of the sum of first N natural numbers to compute the value of the N. Below is the illustration:
⇾ 1 + 2 + 3 + …. N = S
⇾ (N * (N + 1)) / 2 = S
⇾ N * (N + 1) = 2 * S
⇾ N2 + N – 2 * S = 0
Therefore, Calculate the solution of the quadratic equation using Sridharacharya Formula and check if the solution is an integer or not. If Yes then the solution exists. Otherwise, the given number is not sum of first N natural number.
Step by step algorithm:
- Calculate the positive root of equation: N2 + N – 2 * S = 0
- Check if the root is an integer or not
- Return root if it is an integer, else return -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll int isvalid(ll int s)
{
float k = (-1 + sqrt (1 + 8 * s)) / 2;
if ( ceil (k) == floor (k))
return k;
else
return -1;
}
int main()
{
int s = 15;
cout << isvalid(s);
return 0;
}
|
Java
import java.util.*;
class GFG {
public static int isvalid( int s)
{
double k = (- 1.0 + Math.sqrt( 1 + 8 * s)) / 2 ;
if (Math.ceil(k) == Math.floor(k))
return ( int )k;
else
return - 1 ;
}
public static void main(String[] args)
{
int s = 15 ;
System.out.print(isvalid(s));
}
}
|
Python3
import math
def isvalid(s):
k = ( - 1 + math.sqrt( 1 + 8 * s)) / 2
if (math.ceil(k) = = math.floor(k)):
return int (k)
else :
return - 1
s = 15
print (isvalid(s))
|
C#
using System;
class GFG {
public static int isvalid( int s)
{
double k = (-1.0 + Math.Sqrt(1 + 8 * s)) / 2;
if (Math.Ceiling(k) == Math.Floor(k))
return ( int )k;
else
return -1;
}
public static void Main( string [] args)
{
int s = 15;
Console.Write(isvalid(s));
}
}
|
Javascript
<script>
function isvalid(s)
{
let k = (-1.0 + Math.sqrt(1 + 8 * s)) / 2;
if (Math.ceil(k) == Math.floor(k))
return k;
else
return -1;
}
let s = 15;
document.write(isvalid(s));
</script>
|
Time Complexity: O(log(s)) because it is using sqrt() function
Auxiliary Space: O(1)
Last Updated :
22 Nov, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...