diff --git a/Project-Euler/Problem029.js b/Project-Euler/Problem029.js
new file mode 100644
index 0000000000..d7180ea434
--- /dev/null
+++ b/Project-Euler/Problem029.js
@@ -0,0 +1,17 @@
+// https://projecteuler.net/problem=29
+
+/*
+How many distinct terms are in the sequence generated by a^b for 2 <= a <= 100 and 2 <= b <= 100?
+*/
+
+export const distinctPowers = (limit = 100) => {
+  if (limit < 2) throw new Error('Power out of scope')
+  // A Set data structure to keep track of distinct powers
+  let distinctPowerSet = new Set()
+  for (let a = 2; a <= limit; a++) {
+    for (let b = 2; b <= limit; b++) {
+      distinctPowerSet.add(Math.pow(a, b))
+    }
+  }
+  return distinctPowerSet.size
+}
diff --git a/Project-Euler/test/Problem029.test.js b/Project-Euler/test/Problem029.test.js
new file mode 100644
index 0000000000..df6c826349
--- /dev/null
+++ b/Project-Euler/test/Problem029.test.js
@@ -0,0 +1,17 @@
+import { distinctPowers } from '../Problem029'
+
+describe('Distinct numbers of a ^ b where a and b in range [2,100]', () => {
+  it('should throw error when number is less than 2', () => {
+    expect(() => distinctPowers(0)).toThrowError('Power out of scope')
+  })
+  it('should throw error when number is negative', () => {
+    expect(() => distinctPowers(-3)).toThrowError('Power out of scope')
+  })
+  test('if the number is greater than or equal to 2', () => {
+    expect(distinctPowers(5)).toBe(15)
+  })
+  // Project Euler Condition Check
+  test('if the number is greater than or equal to 2', () => {
+    expect(distinctPowers(100)).toBe(9183)
+  })
+})