例子。123456,我们想要从右边数第三个('4')出来。
实践中的想法是分别访问每个数字(即 6 5 4 3 2 1)。
首选 C/C++/C#。
例子。123456,我们想要从右边数第三个('4')出来。
实践中的想法是分别访问每个数字(即 6 5 4 3 2 1)。
首选 C/C++/C#。
更有效的实现可能是这样的:
char nthdigit(int x, int n)
{
while (n--) {
x /= 10;
}
return (x % 10) + '0';
}
如果您只需要其中一个,这可以节省将所有数字转换为字符串格式的工作。而且,您不必为转换后的字符串分配空间。
如果速度是一个问题,您可以预先计算一个 10 的幂数组并使用 n 来索引该数组:
char nthdigit(int x, int n)
{
static int powersof10[] = {1, 10, 100, 1000, ...};
return ((x / powersof10[n]) % 10) + '0';
}
正如其他人所提到的,这与您将要进行以 10 为底的按位运算一样接近。
只是花时间根据这里的答案写这篇文章,所以我想我会分享。
这是基于 Brannon 的回答,但可以让您一次获得多个数字。在我的情况下,我使用它从保存在 int 中的日期和时间中提取部分,其中数字为 yyyymmddhhnnssm_s 格式。
public static int GetDigits(this int number, int highestDigit, int numDigits)
{
return (number / (int)Math.Pow(10, highestDigit - numDigits)) % (int)Math.Pow(10, numDigits);
}
我做了一个扩展,你可能不想这样做,但这里是示例用法:
int i = 20010607;
string year = i.GetDigits(8,4).ToString();
string month = i.GetDigits(4,2).ToString();
string day = i.GetDigits(2,2).ToString();
结果:
年 = 2001
月 = 6
天 = 7
使用以 10 为底的数学:
class Program
{
static void Main(string[] args)
{
int x = 123456;
for (int i = 1; i <= 6; i++)
{
Console.WriteLine(GetDigit(x, i));
}
}
static int GetDigit(int number, int digit)
{
return (number / (int)Math.Pow(10, digit - 1)) % 10;
}
}
产生:
6
5
4
3
2
1
它不能(容易)与按位运算一起工作的原因是十进制系统的基数(10)不是二进制系统的基数(2)的幂。
如果您以 8 为基数进行编码,您将拥有pow(2, 3) == 8
, 并且可以将每个八进制数字提取为三个位的块。
因此,您确实必须转换为 base 10,这通常通过转换为字符串来完成(使用 toString (Java) 或 sprintf (C),正如其他人在回复中所显示的那样)。
这适用于高达 451069 的无符号整数,如下所述:
def hundreds_digit(u): return mod10(div100(u))
def div100(u): return div10(div10(u))
def mod10(u): return u - mul10(div10(u))
def mul10(u): return ((u << 2) + u) << 1
def div10(u):
Q = ((u >> 1) + u) >> 1 # Q = u*0.11
Q = ((Q >> 4) + Q) # Q = u*0.110011
Q = ((Q >> 8) + Q) >> 3 # Q = u*0.00011001100110011
return Q
# Alternatively:
# def div100(u): return (u * 0xa3d7) >> 22
# though that'd only work for 16-bit u values.
# Or you could construct shifts and adds along the lines of div10(),
# but I didn't go to the trouble.
测试一下:
>>> hundreds_digit(123456)
4
>>> hundreds_digit(123956)
9
不过,如果它更快,我会感到惊讶。也许你应该重新考虑你的问题。
值 = (数字 % (10^position)) / 10^(position - 1)
例子:
数字 = 23846
位置 = 1 -> 值 = 6
位置 = 2 -> 值 = 4
位置 = 3 -> 值 = 8
这是一个简单的 Objective-C 实用程序方法来执行此操作:
+ (int)digitAtPosition:(int)pos of:(int)number {
return (number % ((int)pow(10, pos))) / (int)pow(10, pos - 1);
}
您可以尝试按位左移(对于 N-1),然后读取 [0] 处的数字,因为这可能是一种汇编方法。
123456 -> 456 -> 读取第一个数字
以下代码将给出一个数字中的第 n 个数字:
public void getDigit(long n,int k){
int i=0;
long r =0;
while(i<n){
r=n%10;
n=n/10;
i++;
}
System.out.println( k + "th digit from right " + r);
}
只是为了好玩,这里是它的 C# 扩展类:
public static class IntExtensions
{
/// <summary>
/// Returns the nth digit from an int,
/// where 0 is the least significant digit
/// and n is the most significant digit.
/// </summary>
public static int GetDigit(this int number, int digit)
{
for (int i = 0; i < digit; i++)
{
number /= 10;
}
return number % 10;
}
}
用法:
int myNumber = 12345;
int five = myNumber.GetDigit(0);
int four = myNumber.GetDigit(1);
int three = myNumber.GetDigit(2);
int two = myNumber.GetDigit(3);
int one = myNumber.GetDigit(4);
int zero = myNumber.GetDigit(5);
两位数 d1 和 d2 将被传递。程序必须打印第 n 个数字是只有数字与 d1 和 d2 组成的数字系统 输入格式 第一行包含 d1 第二行包含 d2 第三行包含 n d1 不等于 d2
int returndigit(int n,int d)
{
d=d-1;
while(d--)
{
n/=10;
}
return (n%10);
}
在 C 中,您可以执行以下操作,其中 n=0 表示最右边的数字
char nthDigitFromRight(int x,int n)
{
char str[20];
sprintf(str,"%020d",x);
return(str[19 - x]);
}
如果您希望最右边的数字为 n=1,请将 [19-x] 更改为 [20-x]。