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