mirror of
https://github.com/oliverbooth/X10D
synced 2024-11-09 23:45:42 +00:00
Add MultiplicativePersistence for integer types
This commit is contained in:
parent
3ae2827fd5
commit
a7631b0efe
@ -49,4 +49,14 @@ public class ByteTests
|
|||||||
Assert.IsTrue(one.IsOdd());
|
Assert.IsTrue(one.IsOdd());
|
||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, ((byte)0).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, ((byte)10).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, ((byte)25).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, ((byte)39).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, ((byte)77).MultiplicativePersistence());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,18 @@ public class Int16Tests
|
|||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, ((short)0).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, ((short)10).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, ((short)25).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, ((short)39).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, ((short)77).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(5, ((short)679).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(6, ((short)6788).MultiplicativePersistence());
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void NegativeFactorialShouldThrow()
|
public void NegativeFactorialShouldThrow()
|
||||||
{
|
{
|
||||||
|
@ -50,6 +50,21 @@ public class Int32Tests
|
|||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, 0.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, 10.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, 25.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, 39.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, 77.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(5, 679.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(6, 6788.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(7, 68889.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(8, 2677889.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(9, 26888999.MultiplicativePersistence());
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void NegativeFactorialShouldThrow()
|
public void NegativeFactorialShouldThrow()
|
||||||
{
|
{
|
||||||
|
@ -50,6 +50,23 @@ public class Int64Tests
|
|||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, 0L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, 10L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, 25L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, 39L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, 77L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(5, 679L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(6, 6788L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(7, 68889L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(8, 2677889L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(9, 26888999L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(10, 3778888999L.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(11, 277777788888899L.MultiplicativePersistence());
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void NegativeFactorialShouldThrow()
|
public void NegativeFactorialShouldThrow()
|
||||||
{
|
{
|
||||||
|
@ -14,7 +14,7 @@ public class SByteTests
|
|||||||
Assert.AreEqual(1, value.DigitalRoot());
|
Assert.AreEqual(1, value.DigitalRoot());
|
||||||
Assert.AreEqual(1, (-value).DigitalRoot());
|
Assert.AreEqual(1, (-value).DigitalRoot());
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void FactorialShouldBeCorrect()
|
public void FactorialShouldBeCorrect()
|
||||||
{
|
{
|
||||||
@ -36,7 +36,7 @@ public class SByteTests
|
|||||||
{
|
{
|
||||||
const sbyte one = 1;
|
const sbyte one = 1;
|
||||||
const sbyte two = 2;
|
const sbyte two = 2;
|
||||||
|
|
||||||
Assert.IsFalse(one.IsEven());
|
Assert.IsFalse(one.IsEven());
|
||||||
Assert.IsTrue(two.IsEven());
|
Assert.IsTrue(two.IsEven());
|
||||||
}
|
}
|
||||||
@ -46,11 +46,21 @@ public class SByteTests
|
|||||||
{
|
{
|
||||||
const sbyte one = 1;
|
const sbyte one = 1;
|
||||||
const sbyte two = 2;
|
const sbyte two = 2;
|
||||||
|
|
||||||
Assert.IsTrue(one.IsOdd());
|
Assert.IsTrue(one.IsOdd());
|
||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, ((sbyte)0).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, ((sbyte)10).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, ((sbyte)25).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, ((sbyte)39).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, ((sbyte)77).MultiplicativePersistence());
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void NegativeFactorialShouldThrow()
|
public void NegativeFactorialShouldThrow()
|
||||||
{
|
{
|
||||||
|
@ -50,4 +50,16 @@ public class UInt16Tests
|
|||||||
Assert.IsTrue(one.IsOdd());
|
Assert.IsTrue(one.IsOdd());
|
||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, ((ushort)0).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, ((ushort)10).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, ((ushort)25).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, ((ushort)39).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, ((ushort)77).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(5, ((ushort)679).MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(6, ((ushort)6788).MultiplicativePersistence());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ public class UInt32Tests
|
|||||||
{
|
{
|
||||||
const uint one = 1;
|
const uint one = 1;
|
||||||
const uint two = 2;
|
const uint two = 2;
|
||||||
|
|
||||||
Assert.IsFalse(one.IsEven());
|
Assert.IsFalse(one.IsEven());
|
||||||
Assert.IsTrue(two.IsEven());
|
Assert.IsTrue(two.IsEven());
|
||||||
}
|
}
|
||||||
@ -46,8 +46,24 @@ public class UInt32Tests
|
|||||||
{
|
{
|
||||||
const uint one = 1;
|
const uint one = 1;
|
||||||
const uint two = 2;
|
const uint two = 2;
|
||||||
|
|
||||||
Assert.IsTrue(one.IsOdd());
|
Assert.IsTrue(one.IsOdd());
|
||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, 0U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, 10U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, 25U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, 39U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, 77U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(5, 679U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(6, 6788U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(7, 68889U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(8, 2677889U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(9, 26888999U.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(10, 3778888999U.MultiplicativePersistence());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,4 +54,21 @@ public class UInt64Tests
|
|||||||
Assert.IsTrue(one.IsOdd());
|
Assert.IsTrue(one.IsOdd());
|
||||||
Assert.IsFalse(two.IsOdd());
|
Assert.IsFalse(two.IsOdd());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MultiplicativePersistence_ShouldBeCorrect_ForRecordHolders()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0, 0UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(1, 10UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(2, 25UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(3, 39UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(4, 77UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(5, 679UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(6, 6788UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(7, 68889UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(8, 2677889UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(9, 26888999UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(10, 3778888999UL.MultiplicativePersistence());
|
||||||
|
Assert.AreEqual(11, 277777788888899UL.MultiplicativePersistence());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
namespace X10D;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="long" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class Int64Extensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the multiplicative persistence of a specified value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
|
||||||
/// <returns>The multiplicative persistence.</returns>
|
|
||||||
/// <remarks>
|
|
||||||
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
|
||||||
/// </remarks>
|
|
||||||
public static int MultiplicativePersistence(this long value)
|
|
||||||
{
|
|
||||||
var persistence = 0;
|
|
||||||
long product = value;
|
|
||||||
|
|
||||||
while (product > 9)
|
|
||||||
{
|
|
||||||
if (value % 10 == 0)
|
|
||||||
{
|
|
||||||
return persistence + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (value > 9)
|
|
||||||
{
|
|
||||||
value /= 10;
|
|
||||||
if (value % 10 == 0)
|
|
||||||
{
|
|
||||||
return persistence + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long newProduct = 1;
|
|
||||||
long currentProduct = product;
|
|
||||||
while (currentProduct > 0)
|
|
||||||
{
|
|
||||||
newProduct *= currentProduct % 10;
|
|
||||||
currentProduct /= 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
product = newProduct;
|
|
||||||
persistence++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return persistence;
|
|
||||||
}
|
|
||||||
}
|
|
@ -91,4 +91,19 @@ public static class ByteExtensions
|
|||||||
{
|
{
|
||||||
return ((long)value).IsPrime();
|
return ((long)value).IsPrime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this byte value)
|
||||||
|
{
|
||||||
|
return ((long)value).MultiplicativePersistence();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,21 @@ public static class Int16Extensions
|
|||||||
return (short)(r < 0 ? r + divisor : r);
|
return (short)(r < 0 ? r + divisor : r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this short value)
|
||||||
|
{
|
||||||
|
return ((long)value).MultiplicativePersistence();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns an integer that indicates the sign of this 16-bit signed integer.
|
/// Returns an integer that indicates the sign of this 16-bit signed integer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -120,6 +120,21 @@ public static class Int32Extensions
|
|||||||
return r < 0 ? r + divisor : r;
|
return r < 0 ? r + divisor : r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this int value)
|
||||||
|
{
|
||||||
|
return ((long)value).MultiplicativePersistence();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns an integer that indicates the sign of this 32-bit signed integer.
|
/// Returns an integer that indicates the sign of this 32-bit signed integer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -145,6 +145,52 @@ public static class Int64Extensions
|
|||||||
return r < 0 ? r + divisor : r;
|
return r < 0 ? r + divisor : r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this long value)
|
||||||
|
{
|
||||||
|
var persistence = 0;
|
||||||
|
long product = System.Math.Abs(value);
|
||||||
|
|
||||||
|
while (product > 9)
|
||||||
|
{
|
||||||
|
if (value % 10 == 0)
|
||||||
|
{
|
||||||
|
return persistence + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (value > 9)
|
||||||
|
{
|
||||||
|
value /= 10;
|
||||||
|
if (value % 10 == 0)
|
||||||
|
{
|
||||||
|
return persistence + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long newProduct = 1;
|
||||||
|
long currentProduct = product;
|
||||||
|
while (currentProduct > 0)
|
||||||
|
{
|
||||||
|
newProduct *= currentProduct % 10;
|
||||||
|
currentProduct /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
product = newProduct;
|
||||||
|
persistence++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return persistence;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns an integer that indicates the sign of this 64-bit signed integer.
|
/// Returns an integer that indicates the sign of this 64-bit signed integer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -121,6 +121,21 @@ public static class SByteExtensions
|
|||||||
return (sbyte)(r < 0 ? r + divisor : r);
|
return (sbyte)(r < 0 ? r + divisor : r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this sbyte value)
|
||||||
|
{
|
||||||
|
return ((long)value).MultiplicativePersistence();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns an integer that indicates the sign of this 8-bit signed integer.
|
/// Returns an integer that indicates the sign of this 8-bit signed integer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -92,4 +92,19 @@ public static class UInt16Extensions
|
|||||||
{
|
{
|
||||||
return !value.IsEven();
|
return !value.IsEven();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this ushort value)
|
||||||
|
{
|
||||||
|
return ((ulong)value).MultiplicativePersistence();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,4 +92,19 @@ public static class UInt32Extensions
|
|||||||
{
|
{
|
||||||
return !value.IsEven();
|
return !value.IsEven();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this uint value)
|
||||||
|
{
|
||||||
|
return ((ulong)value).MultiplicativePersistence();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,4 +117,50 @@ public static class UInt64Extensions
|
|||||||
{
|
{
|
||||||
return !value.IsEven();
|
return !value.IsEven();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the multiplicative persistence of a specified value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The value whose multiplicative persistence to calculate.</param>
|
||||||
|
/// <returns>The multiplicative persistence.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// Multiplicative persistence is defined as the recursive digital product until that product is a single digit.
|
||||||
|
/// </remarks>
|
||||||
|
[Pure]
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static int MultiplicativePersistence(this ulong value)
|
||||||
|
{
|
||||||
|
var persistence = 0;
|
||||||
|
ulong product = value;
|
||||||
|
|
||||||
|
while (product > 9)
|
||||||
|
{
|
||||||
|
if (value % 10 == 0)
|
||||||
|
{
|
||||||
|
return persistence + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (value > 9)
|
||||||
|
{
|
||||||
|
value /= 10;
|
||||||
|
if (value % 10 == 0)
|
||||||
|
{
|
||||||
|
return persistence + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong newProduct = 1;
|
||||||
|
ulong currentProduct = product;
|
||||||
|
while (currentProduct > 0)
|
||||||
|
{
|
||||||
|
newProduct *= currentProduct % 10;
|
||||||
|
currentProduct /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
product = newProduct;
|
||||||
|
persistence++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return persistence;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user