-3

您好,我有一个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
4

3 回答 3

3

反复除以 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); 
}

我初始化n1,因此如果 的大小小于 100 ,则n2返回n正确的结果。n

请注意,此算法粗心地考虑了一个不必要的步骤(您无需直接运行n0),但这样做可以避免担心负面n情况,并且n1还会产生第一个数字,这可能很有用。

于 2018-05-14T13:26:33.540 回答
3

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

#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;
}
于 2018-05-14T14:10:48.790 回答
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 位,则可以在开始时将其除以1e111e11是浮点文字,请参阅下面的注释)100000000000,以减少循环内的迭代次数。如果这些是可能的输入,您还可以反转负数:

#include <stdio.h>

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

    // handle negative numbers
    if (n < 0)
        n = -n; 

    // get rid of 11 digits
    if (n >= 100000000000)
        n /= 100000000000;

    // handle the remaining digits 
    while (n >= 100)
        n /= 10;

    printf("%lld", n);
    return 0;
}
于 2018-05-14T14:11:54.217 回答