正如Project Euler的问题 37中所述:
数字 3797 有一个有趣的特性。作为素数本身,可以从左到右连续删除数字,并在每个阶段保持素数:3797、797、97 和 7。类似地,我们可以从右到左工作:3797、379、37 和 3。
我已经解决了这个问题(答案以 7 结尾:-),但仍有一个疑问:在不使用字符串的情况下,左/右截断数字的效率如何?我构建了以下代码,但看起来很难看:
public static void Main()
{
Console.WriteLine( // 3797, 379, 37, 3, 797, 97, 7
String.Join(", ", 3797L.Truncate().ToArray()));
Console.ReadLine();
}
static IEnumerable<long> Truncate(this long number)
{
yield return number;
long aux = number;
while ((aux /= 10) > 0) // right to left
yield return aux;
// god forgive me, but it works
while ((number = (number.Reverse() / 10).Reverse()) > 0) // left to right
{
yield return number;
}
}
public static long Reverse(this long number)
{
long reverse = number % 10;
number = number / 10;
while (number != 0)
{
reverse = (number % 10) + (10 * reverse);
number = number / 10;
}
return reverse;
}
编辑:我以这段代码结束:
static IEnumerable<long> Truncate(this long number)
{
yield return number;
int i = 10;
while (number / i > 0)
{
yield return number / i;
yield return number % i;
i *= 10;
}
}