Skip to content

Commit 7c4e8fb

Browse files
authored
Add Keith Number (#111) (#259)
1 parent 5568f4c commit 7c4e8fb

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Algorithms.Numeric;
2+
using NUnit.Framework;
3+
using System;
4+
5+
namespace Algorithms.Tests.Numeric
6+
{
7+
public static class KeithNumberTest
8+
{
9+
[Test]
10+
[TestCase(14)]
11+
[TestCase(47)]
12+
[TestCase(197)]
13+
[TestCase(7909)]
14+
public static void KeithNumberWork(int number)
15+
{
16+
// Act
17+
var result = KeithNumberChecker.IsKeithNumber(number);
18+
19+
// Assert
20+
Assert.IsTrue(result);
21+
}
22+
23+
[Test]
24+
[TestCase(-2)]
25+
public static void KeithNumberShouldThrowEx(int number)
26+
{
27+
// Arrange
28+
29+
// Assert
30+
Assert.Throws<ArgumentException>(() => KeithNumberChecker.IsKeithNumber(number));
31+
}
32+
}
33+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using System;
2+
3+
namespace Algorithms.Numeric
4+
{
5+
/// <summary>
6+
/// In number theory, a Keith number or repfigit number is a natural number n in a given number base b with k digits such that
7+
/// when a sequence is created such that the first k terms are the k digits of n and each subsequent term is the sum of the
8+
/// previous k terms, n is part of the sequence.
9+
/// </summary>
10+
public static class KeithNumberChecker
11+
{
12+
/// <summary>
13+
/// Checks if a number is a Keith number or not.
14+
/// </summary>
15+
/// <param name="number">Number to check.</param>
16+
/// <returns>True if it is a Keith number; False otherwise.</returns>
17+
public static bool IsKeithNumber(int number)
18+
{
19+
if (number < 0)
20+
{
21+
throw new ArgumentException($"{nameof(number)} cannot be negative");
22+
}
23+
24+
var tempNumber = number;
25+
26+
var stringNumber = number.ToString();
27+
28+
var digitsInNumber = stringNumber.Length;
29+
30+
/* storing the terms of the series */
31+
var termsArray = new int[number];
32+
33+
for (var i = digitsInNumber - 1; i >= 0; i--)
34+
{
35+
termsArray[i] = tempNumber % 10;
36+
tempNumber /= 10;
37+
}
38+
39+
var sum = 0;
40+
var k = digitsInNumber;
41+
while (sum < number)
42+
{
43+
sum = 0;
44+
45+
for (var j = 1; j <= digitsInNumber; j++)
46+
{
47+
sum += termsArray[k - j];
48+
}
49+
50+
termsArray[k] = sum;
51+
k++;
52+
}
53+
54+
return sum == number;
55+
}
56+
}
57+
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ This repository contains algorithms and data structures implemented in C# for ed
4242
* [Series](./Algorithms/Numeric/Series)
4343
* [Maclaurin Series](./Algorithms/Numeric/Series/Maclaurin.cs)
4444
* [Gauss-Jordan Elimination](./Algorithms/Numeric/GaussJordanElimination.cs)
45+
* [Keith Number Checker](./Algorithms/Numeric/KeithNumberChecker.cs)
4546
* [Pseudo-Inverse](./Algorithms/Numeric/Pseudoinverse/PseudoInverse.cs)
4647
* [Narcissistic Number Checker](./Algorithms/Numeric/NarcissisticNumberChecker.cs)
4748
* [Perfect Number Checker](./Algorithms/Numeric/PerfectNumberChecker.cs)

0 commit comments

Comments
 (0)