2009-07-05 82 views
3

如果我有一个像12345这样的数字,并且我想要一个2345的输出,是否有一个数学算法可以做到这一点?在我的黑客想要将数字转换为一个字符串,并将其字符串。我知道这会起作用,但我相信必须有更好的方式,谷歌正在让我失望。从数字中去掉前导/后缀数字的最佳方法是什么?

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

+0

它应该是什么基础? – Gumbo 2009-07-05 15:39:42

+0

基数10,使用整数 – 2009-07-05 15:40:47

+0

在许多语言中,底数隐含在整数除法中。 – starblue 2009-07-05 15:55:34

回答

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 
9

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

n % 10000 

即模WRT。 10000?对于第二种情况,如果使用整数算术,则除以10.您可能希望以更明确的方式通过使用10进行修改来获得最后一位数字,然后减去然后除(想想基地10的转变)。

+0

+1:12345 10000%= 2345 – 2009-07-05 15:48:17

1

我不认为除去除尾数字还有别的办法。重复整数除法可能更有效率,而不是投入浮点数,执行指数,然后发回并整形为一个整数,但基本思想保持不变。

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

0

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

3

是,模数运算符(%)这是目前在大多数语言,可以返回n个最后位数:

12345%10^4 = 12345%10000 = 2345

积分除(/在C/C++ /爪哇)可以返回第一n位数字:

12345/10^4 = 12345/10000 = 1

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; 
} 
2

转换成字符串,然后使用一个子方法最终将成为最快最好的方法,因为你可以剥去字符,而不是做数学。

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

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

对于剥离最后的数字,你的方式工作得很好。比这样的快速配方更容易吗?

1

你必须认识到,数字不数字,只有串做,多少(和)数字他们完全取决于基础上(这数字也没有)。在内部,计算机使用二进制字符串。因此,一般来说,操纵基数为10的数字需要您首先将数字转换为字符串 - 或者进行与将其转换为字符串时相同的计算。但是,对于删除前导和后缀数字的具体任务,这些计算(模数和整数除法)非常简单,而且比转换整个数字要快得多。

相关问题