获取一个 long long 数字的前两位
Get first two digits of a long long number
您好,我有一个 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
重复除以 10 直到得到 0,记住倒数第二个值,你最终会 return 作为结果。
换句话说,
#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
和 n2
初始化为 n
,因此如果 n
的大小小于 100,则正确的结果是 returned。
请注意,此算法粗心地考虑了不必要的步骤(您不需要 运行 n
一直到 0
),但这样做可以省去担心负面 n
个案例,并且 n1
也会产生第一个数字,这可能很有用。
假设该数字在编译时可用,您可以在编译时通过将其转换为字符串来提取它:
#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;
}
如果您不需要考虑负数,@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
是一个浮点字面量,见下面的注释) 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;
}
您好,我有一个 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
重复除以 10 直到得到 0,记住倒数第二个值,你最终会 return 作为结果。
换句话说,
#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
和 n2
初始化为 n
,因此如果 n
的大小小于 100,则正确的结果是 returned。
请注意,此算法粗心地考虑了不必要的步骤(您不需要 运行 n
一直到 0
),但这样做可以省去担心负面 n
个案例,并且 n1
也会产生第一个数字,这可能很有用。
假设该数字在编译时可用,您可以在编译时通过将其转换为字符串来提取它:
#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;
}
如果您不需要考虑负数,@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
是一个浮点字面量,见下面的注释) 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;
}