31

假设我有一个名为“score”的整数,它看起来像这样:

int score = 1529587;

现在我想做的是使用按位运算符从分数中获取每个数字 1、5、2、9、5、8、7 (参见下面的编辑说明)。

我很确定这是可以做到的,因为我曾经使用过类似的方法从十六进制颜色值中提取红绿色和蓝色值。

我该怎么做?

编辑
它不一定是按位运算符,我只是认为那样会更简单。

4

10 回答 10

62

您使用模运算符:

while(score)
{
    printf("%d\n", score % 10);
    score /= 10;
}

请注意,这将以相反的顺序为您提供数字(即最低有效数字在前)。如果你想要最重要的数字,你必须将数字存储在一个数组中,然后以相反的顺序读出它们。

于 2010-06-25T13:47:36.603 回答
5

RGB 值很好地落在位边界上;十进制数字没有。我认为根本没有一种简单的方法可以使用按位运算符来做到这一点。您需要使用十进制运算符,例如模 10 (% 10)。

于 2010-06-25T13:47:39.583 回答
4

同意前面的回答。

一点更正:有一种更好的方法可以从左到右打印十进制数字,而无需分配额外的缓冲区。此外,如果score为 0,您可能希望显示一个零字符(前面的答案中建议的循环不会打印任何内容)。

这需要额外的通过:

int div;
for (div = 1; div <= score; div *= 10)
    ;

do
{
    div /= 10;
    printf("%d\n", score / div);
    score %= div;
} while (score);
于 2010-06-25T15:59:15.837 回答
4

不要重新发明轮子。Csprintf是有原因的。

由于您的变量称为分数,我猜这是针对您计划使用分数的各个数字将数字字形显示为图像的游戏。在这种情况下,sprintf具有方便的格式修饰符,可让您使用零填充、空格填充等将乐谱调整为您可能想要使用的固定宽度。

于 2010-06-26T05:45:00.407 回答
2

此解决方案在整个 [0,UINT_MAX] 范围内提供正确的结果,而无需缓冲数字。

它也适用于具有适当类型更改的更广泛类型或有符号类型(具有正值)。

这种方法在小型环境(例如 Arduino 引导加载程序)上特别有用,因为它最终不会导致所有 printf() 膨胀(当 printf() 不用于演示输出时)并且使用很少的 RAM。您只需闪烁单个 LED 即可查看价值 :)

#include <limits.h>
#include <stdio.h>

int
main (void)
{
  unsigned int score = 42;   // Works for score in [0, UINT_MAX]

  printf ("score via printf:     %u\n", score);   // For validation

  printf ("score digit by digit: ");
  unsigned int div = 1;
  unsigned int digit_count = 1;
  while ( div <= score / 10 ) {
    digit_count++;
    div *= 10;
  }
  while ( digit_count > 0 ) {
    printf ("%d", score / div);
    score %= div;
    div /= 10;
    digit_count--;
  }
  printf ("\n");

  return 0;
}
于 2017-06-14T07:14:36.810 回答
0
#include<stdio.h>

int main() {
int num; //given integer
int reminder;
int rev=0; //To reverse the given integer
int count=1;

printf("Enter the integer:");
scanf("%i",&num);

/*First while loop will reverse the number*/
while(num!=0)
{
    reminder=num%10;
    rev=rev*10+reminder;
    num/=10;
}
/*Second while loop will give the number from left to right*/
while(rev!=0)
{
    reminder=rev%10;
    printf("The %d digit is %d\n",count, reminder);
    rev/=10;
    count++; //to give the number from left to right 
}
return (EXIT_SUCCESS);}
于 2018-09-04T17:16:31.187 回答
0
//this can be easily understandable for beginners     
int score=12344534;
int div;
for (div = 1; div <= score; div *= 10)
{

}
/*for (div = 1; div <= score; div *= 10); for loop with semicolon or empty body is same*/
while(div>1)
{
    div /= 10;
    printf("%d\n`enter code here`", score / div);
    score %= div;
}
于 2018-07-19T05:30:08.573 回答
0

首先使用 将整数转换为字符串sprintf,然后对其元素执行任何操作,即chars. 假设unsigned分数:

unsigned int score = 1529587, i;
char stringScore [11] = { 0 };

sprintf( stringScore, "%d, score );

for( i=0; i<strlen(stringScore); i++ )
    printf( "%c\n", stringScore[i] );

请注意如何:

  • 它从最重要的一位开始打印数字
  • stringScore假设 的大小int在您的平台中为 4 个字节,则为 11 个字符长,因此最大整数为 10 位长。第十一个是字符串终止符'\0'
  • sprintf为您完成所有工作

每个数字都需要一个整数吗?

由于我们确定stringScore它只包含数字,因此转换非常容易。如果dig是包含数字的字符,则可以通过这种方式获得对应的整数:

int intDigit = dig - '0';
于 2021-03-13T14:26:30.977 回答
0

通常,通过在循环中使用数字的模或将数字转换为字符串来解决此问题。要将数字转换为字符串,您可以使用函数itoa,因此请考虑循环中数字取模的变体。


文件内容get_digits.c

$ cat get_digits.c 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


// return a length of integer
unsigned long int get_number_count_digits(long int number);

// get digits from an integer number into an array
int number_get_digits(long int number, int **digits, unsigned int *len);

// for demo features
void demo_number_get_digits(long int number);


int
main()
{
    demo_number_get_digits(-9999999999999);
    demo_number_get_digits(-10000000000);
    demo_number_get_digits(-1000);
    demo_number_get_digits(-9);
    demo_number_get_digits(0);
    demo_number_get_digits(9);
    demo_number_get_digits(1000);
    demo_number_get_digits(10000000000);
    demo_number_get_digits(9999999999999);
    return EXIT_SUCCESS;
}


unsigned long int
get_number_count_digits(long int number)
{
    if (number < 0)
        number = llabs(number);
    else if (number == 0)
        return 1;

    if (number < 999999999999997)
        return floor(log10(number)) + 1;

    unsigned long int count = 0;
    while (number > 0) {
        ++count;
        number /= 10;
    }
    return count;
}


int
number_get_digits(long int number, int **digits, unsigned int *len)
{
    number = labs(number);

    // termination count digits and size of a array as well as
    *len = get_number_count_digits(number);

    *digits = realloc(*digits, *len * sizeof(int));

    // fill up the array
    unsigned int index = 0;
    while (number > 0) {
        (*digits)[index] = (int)(number % 10);
        number /= 10;
        ++index;
    }

    // reverse the array
    unsigned long int i = 0, half_len = (*len / 2);
    int swap;
    while (i < half_len) {
        swap = (*digits)[i];
        (*digits)[i] = (*digits)[*len - i - 1];
        (*digits)[*len - i - 1] = swap;
         ++i;
    }

    return 0;
}


void
demo_number_get_digits(long int number)
{
    int *digits;
    unsigned int len;

    digits = malloc(sizeof(int));

    number_get_digits(number, &digits, &len);

    printf("%ld --> [", number);
    for (unsigned int i = 0; i < len; ++i) {
        if (i == len - 1)
            printf("%d", digits[i]);
        else
            printf("%d, ", digits[i]);
    }
    printf("]\n");

    free(digits);
}

使用 GNU GCC 进行演示

$~/Downloads/temp$ cc -Wall -Wextra -std=c11 -o run get_digits.c -lm
$~/Downloads/temp$ ./run
-9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
-10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
-1000 --> [1, 0, 0, 0]
-9 --> [9]
0 --> [0]
9 --> [9]
1000 --> [1, 0, 0, 0]
10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

使用 LLVM/Clang 进行演示

$~/Downloads/temp$ rm run
$~/Downloads/temp$ clang -std=c11 -Wall -Wextra get_digits.c -o run -lm
setivolkylany$~/Downloads/temp$ ./run
-9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
-10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
-1000 --> [1, 0, 0, 0]
-9 --> [9]
0 --> [0]
9 --> [9]
1000 --> [1, 0, 0, 0]
10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

测试环境

$~/Downloads/temp$ cc --version | head -n 1
cc (Debian 4.9.2-10) 4.9.2
$~/Downloads/temp$ clang --version
Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
于 2017-03-11T19:12:32.973 回答
-1

我已经做了这个解决方案,它很简单,而不是读取一个整数,我读取一个字符串(C 中的 char 数组),然后用 for bucle 编写,代码还写入数字的总和

// #include<string.h>

scanf("%s", n);
int total = 0;

for (int i = 0; i< strlen(n); i++){
    printf("%c", n[i]);
    total += (int)(n[i]) -48;
}

printf("%d", total);
于 2020-07-20T21:42:24.543 回答