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

时间:2009-07-05 15:36:34

标签: algorithm language-agnostic

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

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

8 个答案:

答案 0 :(得分:9)

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

n % 10000

即。模数wrt。 10000?

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

答案 1 :(得分:3)

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

12345%10 ^ 4 = 12345%10000 = 2345

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

12345/10 ^ 4 = 12345/10000 = 1

答案 2 :(得分:2)

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

如果你真的不想这样做,你应该使用模数(%),它给出了除法的余数。 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是要剥离的最低位。

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这是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;
}