繁体   English   中英

从数字中删除前导/尾随数字的最佳方法是什么?

[英]What's the best way to strip leading / trailing digits from a number?

如果我有一个像12345这样的数字,并且我想要一个2345的输出,那么有一个数学算法吗? 我的黑客想要将数字转换为字符串,并将其子串。 我知道这会有效,但我确信必须有更好的方法,谷歌让我失望。

同样,对于12345,如果我想要1234,是否还有另一种算法可以做到这一点? 我能想到的最好的是Floor(x / 10^(n)) ,其中x是输入,n是要剥离的数字的数量,但我觉得必须有更好的方法,我只是可以看不到。

在第一种情况下,你不只是想要

n % 10000

即模数wrt。 10000?

对于你的第二种情况,如果你使用整数运算,只需要除以10.你可能希望以更“明确”的方式做到这一点,通过用10修改得到最后一位数,减去然后除(想想一个转变)在基地10)。

是的,大多数语言中存在的模数运算符(%)可以返回n个最后数字:

12345%10 ^ 4 = 12345%10000 = 2345

积分除法(/在C / C ++ / Java中)可以返回前n位数:

12345/10 ^ 4 = 12345/10000 = 1

转换为字符串,然后使用子字符串方法最终将是最快和最好的方法,因为您可以删除字符而不是数学。

如果你真的不想这样做,你应该使用模数(%),它给出了除法的余数。 11%3 = 2,因为3只能进入11次3次(9)。 剩下的是2. 41%10 = 1,因为10可以进入41次4次(40)。 剩下的就是1。

对于剥离第一个数字,您所要做的就是修改您想要摆脱的十位数值。 对于从12345剥离两位数,你应该模数为1000. 1000进入12345十二次,然后余数将是345,这是你的答案。 你只需要找到一种方法来找到你试图去掉的最后一个数字的十进制值。 使用x%(10 ^(n)),其中x是输入,n是要剥离的最低位。

为了剥离最后的数字,你的方式工作得很好。 什么比这样的快速公式更容易?

Python 3.0:

>>> import math
>>> def remove_most_significant_digit(n, base=10):
...     return n % (base ** int(math.log(n, base)))
...
>>> def remove_least_significant_digit(n, base=10):
...     return int(n // base)
...
>>> remove_most_significant_digit(12345)
2345
>>> remove_least_significant_digit(12345)
1234

我不认为除去尾随数字之外还有其他方法而不是除法。 进行重复积分除法可能比投射到浮点数,执行指数,然后求平面并转换回整数更有效,但基本思想保持不变。

请记住,任何基地的操作几乎相同。 要删除一个尾随的十进制数字,你执行/ 10.如果你有0b0111并且想要删除一个数字,那么它必须是/ 2。 或者你可以让0xff / 16得到0x0f。

你必须认识到,数字没有数字,只有串做,多少(和)数字他们完全依赖的基础上(该数字不具有任何)。 在内部,计算机使用的是二进制字符串。 因此,通常,操作基数为10的数字需要先将数字转换为字符串 - 或者进行与将其转换为字符串时相同的计算。 但是,对于删除前导和尾随数字的特定任务,这些计算(模数和整数除法)非常简单,并且比转换整数更快。

我认为转换为字符串,然后删除第一个字符不会做的伎俩。 我相信转换为字符串的alg正在执行div-mod例程,为了优化你也可以自己做div-mod alg并根据你的需要操作它

这是C ++代码......它没有经过测试。

int myPow ( int n , int k ){
int ret = 1;
for (int i=0;i<k;++i) ret*=n;
return ret;
}

int countDigits (int n ){
 int count = 0;
 while ( n )++count, n/=10;
return count;
}

int getLastDigits (int number , int numDigits ){
  int tmp = myPow ( 10 , numDigits );
  return number % tmp;
}

int getFirstDigits (int number, numDigits ){
   int tmp = myPow ( 10, countDigits ( number) - numDigits );
   return nuber / tmp;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM