如何在 C 中找到 long 的长度(位数)?
How to find the length(number of digits)of a long in C?
这是提示用户输入的代码
#include <stdio.h>
#include <cs50.h>
//prompt user for number
int main(void)
{
long number = get_long("Enter card number: ");
}
例如你可以这样做:
#include <stdio.h>
#include <string.h>
void main()
{
long alpha = 352;
char s[256];
sprintf(s,"%ld",(alpha >= 0L) ? alpha : -alpha );
printf("long digits: %lu",strlen(s));
}
下面的程序会对你有所帮助,但最好再努力一下
#include <stdio.h>
#include <cs50.h>
//prompt user for numb er
int main(void)
{
long number = get_long("Enter card number: ");
int count = 0;
do{
number = number / 10;
++count;
}while (number != 0) ;
printf("length of number = %d",count);
}
如果您允许自己使用浮点数,则正整数 A
的位数 B
是以 B 为底的 A 的对数加 1。以 10 为底工作你可以写:
long get_num_digits(long a)
{
long c;
if (a == 0) {
return 1;
}
if (a < 0) {
a = -a;
}
c = (long)log10((double)a);
++c;
return c;
}
此版本解决了 Andrew Henle 提出的问题,并且能够处理具有任意位数的 long。
在对非正参数采取必要的预防措施后,我们以 2 为底数计算参数的对数,并通过乘以 lod_10(2) 将对数底数更改为以 10 为底数。
必须相应地选择以 10 为底的对数 2 的位数。以下版本适用于 1 到 1000 位长,不使用浮点数、一次整数乘法、一次整数除法和最多 N-1 次移位,其中 N 是参数的位数。
/*
* Using 3 digits from log_10(2), we have enough precision to calculate the
* number of digits of a 1000 bit number.
*/
/* #define LOG_10_2 301029995663981198 */
#define LOG_10_2_NUMERATOR 301
#define LOG_10_2_DENOMINATOR 1000
long get_num_digits3(long a)
{
long c;
long i;
if (a == 0) {
return 1;
}
if (a < 0) {
a = -a;
}
/* i = log_2(a); */
i = 0;
while (a) {
a >>= 1;
++i;
}
/* c = log_10(a) + 1 */
c = (long)(LOG_10_2_NUMERATOR * i);
c /= LOG_10_2_DENOMINATOR;
++c;
return c;
}
这是提示用户输入的代码
#include <stdio.h>
#include <cs50.h>
//prompt user for number
int main(void)
{
long number = get_long("Enter card number: ");
}
例如你可以这样做:
#include <stdio.h>
#include <string.h>
void main()
{
long alpha = 352;
char s[256];
sprintf(s,"%ld",(alpha >= 0L) ? alpha : -alpha );
printf("long digits: %lu",strlen(s));
}
下面的程序会对你有所帮助,但最好再努力一下
#include <stdio.h>
#include <cs50.h>
//prompt user for numb er
int main(void)
{
long number = get_long("Enter card number: ");
int count = 0;
do{
number = number / 10;
++count;
}while (number != 0) ;
printf("length of number = %d",count);
}
如果您允许自己使用浮点数,则正整数 A
的位数 B
是以 B 为底的 A 的对数加 1。以 10 为底工作你可以写:
long get_num_digits(long a)
{
long c;
if (a == 0) {
return 1;
}
if (a < 0) {
a = -a;
}
c = (long)log10((double)a);
++c;
return c;
}
此版本解决了 Andrew Henle 提出的问题,并且能够处理具有任意位数的 long。
在对非正参数采取必要的预防措施后,我们以 2 为底数计算参数的对数,并通过乘以 lod_10(2) 将对数底数更改为以 10 为底数。
必须相应地选择以 10 为底的对数 2 的位数。以下版本适用于 1 到 1000 位长,不使用浮点数、一次整数乘法、一次整数除法和最多 N-1 次移位,其中 N 是参数的位数。
/*
* Using 3 digits from log_10(2), we have enough precision to calculate the
* number of digits of a 1000 bit number.
*/
/* #define LOG_10_2 301029995663981198 */
#define LOG_10_2_NUMERATOR 301
#define LOG_10_2_DENOMINATOR 1000
long get_num_digits3(long a)
{
long c;
long i;
if (a == 0) {
return 1;
}
if (a < 0) {
a = -a;
}
/* i = log_2(a); */
i = 0;
while (a) {
a >>= 1;
++i;
}
/* c = log_10(a) + 1 */
c = (long)(LOG_10_2_NUMERATOR * i);
c /= LOG_10_2_DENOMINATOR;
++c;
return c;
}