C语言 获取长长数字的前两位数字



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

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

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

反复除以 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 时返回正确的结果。

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

如果你不需要考虑负数,@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 位,则可以将其除以开头1000000000001e11(1e11是浮点文字,请参阅下面的注释(,以减少循环内的迭代次数。如果这些是可能的输入,您还可以反转负数:

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

相关内容

  • 没有找到相关文章

最新更新