C# 如何在没有字符串的情况下左/右截断数字(Euler#37)

C# 如何在没有字符串的情况下左/右截断数字(Euler#37),c#,truncate,C#,Truncate,如在中所述: 3797这个数字有一个有趣的特性。作为素数本身,可以从左到右连续删除数字,并在每个阶段保持素数:3797、797、97和7。类似地,我们可以从右到左工作:3797、379、37和3 我已经解决了这个问题(答案以7:-)结尾,但仍然存在疑问:在不使用字符串的情况下,左/右截断数字的效率如何?我构建了以下代码,但看起来很难看: public static void Main() { Console.WriteLine( // 3797, 379, 37, 3, 797, 97,

如在中所述:

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;
}
publicstaticvoidmain()
{
Console.WriteLine(//3797379,37,379797,7
Join(“,”,3797L.Truncate().ToArray());
Console.ReadLine();
}
静态IEnumerable截断(此长数字)
{
收益返回数;
长aux=数字;
而((aux/=10)>0)//从右向左
收益率;
//上帝饶恕我,但它起作用了
而((number=(number.Reverse()/10.Reverse())>0)//从左到右
{
收益返回数;
}
}
公共静态长反转(此长数字)
{
长反转=数字%10;
数字=数字/10;
while(数字!=0)
{
反向=(数字%10)+(10*反向);
数字=数字/10;
}
反向返回;
}
编辑:我以以下代码结束:

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;
    }
}
static IEnumerable Truncate(这个长数字)
{
收益返回数;
int i=10;
而(数字/i>0)
{
收益返回数/i;
收益返回数%i;
i*=10;
}
}

要截断最右边的数字,请除以10(您的代码已经这样做了)

要截断n位数字左侧的一位数字,请取该数字的模10^(n-1)

示例:3797%1000->797

编辑:为了澄清我建议如何获得模的值:

w <- n
d <- 1
while (w <> 0)
  test primality of w
  w <- w / 10
  d <- d * 10
end
w <- n
while (d <> 10)
  d <- d / 10
  w <- w % d
  test primality of w
end

w你不能除以十吗

3797/10=379

379/10=37

37/10=3

不需要任何条件

另一种方法是使用%

var numbers=GetNumbers(3797);
var numbers = GetNumbers(3797);  

public static IEnumerable<int> GetNumbers(int val)
        {
            int ba = 1;
            int result = 1;

            while(result > 0)
            {

                ba *= 10;
                result = val / ba;
                if(result > 0)
                    yield return result;
            }

        }
公共静态IEnumerable GetNumbers(int-val) { int-ba=1; int结果=1; 而(结果>0) { ba*=10; 结果=val/ba; 如果(结果>0) 收益结果; } }
将产生

379 373


如何在没有字符串的情况下确定
n
?这是一加上数字以10为底的对数的整数部分。如果您的语言没有log10,只有e-base对数,您可以通过除以e-base对数10将其转换为另一个。请注意,计算对数以确定位数有点过分。你可以用连续的10除法来计算数字的个数,这可能更经济。特别是,你可以在第一遍从右向左删除数字的同时计算数字。@Pascal,这个答案让我哭了,ty=)+1,这个,再加上John的答案,使我最终实现了,ty