获取一个长长号码的前两位数字

时间:2018-05-14 13:17:28

标签: c long-long

你好我有一个long long号,长度从13,15到16位不等。我想得到这些数字的前两位数字(左起)。 例如:

Enter Number = 1234567890123;
First 2 digits = 12
Enter Number = 453456789012345;
First 2 digits = 45
Enter Number = 3534567890123456;
First 2 digits = 35

3 个答案:

答案 0 :(得分:2)

重复除以10直到达到0,记住数字的倒数第二个值,最终将返回结果。

换句话说,

#include <stdio.h>

int main(void) {
    long long n = 3534567890123456; 
    long long n1 = n, n2 = n; // n2 will hold the first two digits. 
    while (n){
        n2 = n1;
        n1 = n;
        n /= 10;
    }   
    printf("%lld", n2); 
}

我将n1n2初始化为n,以便在n的幅度小于100时返回正确的结果。

请注意,此算法不小心考虑了一个不必要的步骤(您不需要将n直接运行到0),但这样做可以省去不必担心负n个案例,并且n1也会产生第一个数字,这可能很有用。

答案 1 :(得分:2)

假设编号时可以使用该编号,您可以在编译时通过将其转换为字符串来提取它:

#include <stdio.h>

#define NUMBER 1234567890123

#define STR(n) #n
#define FIRST(n)  STR(n)[0]
#define SECOND(n) STR(n)[1]

int main(void)
{
  printf("%c %c", FIRST(NUMBER), SECOND(NUMBER));

  return 0;
}

答案 2 :(得分:1)

如果你不需要考虑负数,那么@ Bathsheba算法的一个稍微简单的版本就是:

#include <stdio.h>

int main(void)
{
    long long n = 3534567890123456;

    // divide until we get to 10..99
    while (n >= 100)
        n /= 10;

    printf("%lld", n);
    return 0;
}

如果您还知道该数字大于13位,您可以将其除以 1e11 1e11是一个浮点文字,请参阅下面的评论){{ 1}}在开始时,减少循环内的迭代次数。如果这些是可能的输入,您也可以反转负数:

100000000000