전체 정수에서 각 개별 숫자 가져오기
제가 'score'라는 정수를 가지고 있다고 가정해 보겠습니다. 이 정수는 다음과 같습니다.
int score = 1529587;
이제 제가 하고 싶은 것은 점수에서 각각의 숫자 1,5,2,9,5,8,7을 얻는 것입니다.
비트 와이즈 연산자 사용 (아래 편집 노트 참조).
저는 비슷한 방법으로 16진수 색상 값에서 빨간색 녹색과 파란색 값을 추출한 적이 있기 때문에 이 방법을 사용할 수 있다고 확신합니다.
제가 이걸 어떻게 하죠?
꼭 비트 연산자일 필요는 없고, 그렇게 하면 좀 더 간단할 것 같아서요.
모듈로 연산자를 사용합니다.
while(score)
{
printf("%d\n", score % 10);
score /= 10;
}
이렇게 하면 숫자가 역순으로 표시됩니다(즉, 최하위 숫자가 먼저 표시됨).가장 의미 있는 숫자를 먼저 원하는 경우에는 숫자를 배열로 저장한 다음 역순으로 읽어내야 합니다.
RGB 값은 비트 경계에서 잘 떨어지며 십진 숫자는 그렇지 않습니다.비트 와이즈 연산자를 사용하여 이를 수행하는 쉬운 방법은 전혀 없다고 생각합니다.모듈로 10(% 10)과 같은 십진 연산자를 사용해야 합니다.
이전 답변에 동의합니다.
약간의 수정: 추가로 하는 더 추가 버퍼를 할당하지 않고 왼쪽에서 오른쪽으로 10진수를 인쇄하는 더 좋은 방법이 있습니다..score
는 0입니다(앞의 답변에서 제시된 루프는 아무것도 인쇄되지 않습니다).
이 경우 추가 패스가 필요합니다.
int div;
for (div = 1; div <= score; div *= 10)
;
do
{
div /= 10;
printf("%d\n", score / div);
score %= div;
} while (score);
바퀴를 다시 만들지 마.채스sprintf
까닭이 있어서
당신의 변수가 스코어라고 불리는 것이기 때문에, 이것은 당신이 숫자 글리프를 이미지로 표시하기 위해 스코어의 개별 숫자를 사용할 계획인 게임에 대한 것이라고 추측합니다.에는.sprintf
에는 제로패드, 스페이스패드 등을 사용할 수 있는 고정된 너비의 점수를 얻을 수 있는 편리한 형식 수정자가 있습니다.
이 솔루션은 전체 범위 [0,UINT_MAX]에서 숫자 버퍼링 없이 올바른 결과를 제공합니다.
또한 적절한 유형 변경이 있는 더 넓은 유형 또는 부호가 있는 유형(양의 값을 가지는)에도 적용됩니다.
이러한 방식은 작은 환경(예: 아두이노 부트로더)에서 특히 유용한데, 이는 모든 printf() bloat((프린트f())를 끌어 들이지 않고(데모 출력에 사용하지 않는 경우) 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;
}
//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;
}
일반적으로 이 문제는 루프에서 숫자의 모듈로를 사용하거나 숫자를 문자열로 변환하면 해결됩니다.숫자를 문자열로 변환하려면 함수 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
#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);}
를 합니다를 합니다.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
는 11의 다이라고 입니다.int
는 4 는 10 입니다.입니다입니다.'\0'
.sprintf
일을다로 .
한 자리 숫자마다 정수가 있어야 합니까?
가 그 요.stringScore
숫자만 포함하고 있어요. 변환이 정말 쉽죠.dig
정수는 과 같은 방법으로 수 :이며,다.
int intDigit = dig - '0';
뭐, 비록 대답은 했지만, 제 생각엔 제 코를 들이밀 수 있을 것 같은데요.
우리는 최소에서 최대까지, 즉 눈에 보이는 역순으로 숫자를 추출할 것입니다.
실제로 래딕스 팔레트 내에서 위치 또는 인덱스를 추출하고 있습니다.기수 또는 기수는 숫자 체계의 기초입니다.Base-10은 단순히 10자리, Base-2는 2자리 등을 의미합니다.
예를 들어, 만약 우리가 16진을 대신 사용한다면, 우리는 익숙한 10개의 "자리"(즉, 10~15개, 나중에 A~F로 번역됨)를 넘어서는 위치에 도달하게 됩니다.아무튼...
int value = 564738291;
int radix = 10;
int array[32]; // At the end = { 5, 6, 4, 7, 3, 8, 2, 9, 1 }
int index = 0; // At the end = 9
if(value == 0) // If value is zero ..
{
array[index++] = 0; // .. we add a zero, and we're done.
}
else
{
while(value != 0)
{
array[index++] = value % radix; // Copy the value into the array.
value /= radix;
}
}
여기서 끝으로 우리 배열은 숫자로 채워질 것이고, 10 이하의 기수는 숫자로 직접 사용될 수 있지만, 10을 넘는 기수의 경우 선택된 기수의 숫자를 시각화하기 위해 사용될 "문자"로 변환되어야 합니다.
예를 들어, 16진수에서 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15일 수 있습니다.인쇄하면 각각 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'로 번역할 수 있습니다.따라서 배열의 숫자는 여전히 정확하지만 실제로는 선택한 기수 내의 지수일 뿐입니다.
그러나 중요한 것은 이 값을 사용하여 radix = 2의 값을 추출할 수 있다는 것입니다(binary, 1과 0을 얻는다).
base-20 (vigesimal)과 함께 사용한 다음 가능한 20개의 숫자를 유니코드의 마야 숫자(또는 base-20을 사용하는 다른 시스템)로 번역하거나 바빌로니아 base-60을 사용하지 않는 이유는 무엇입니까? :)
또한, 기수가 클수록 숫자를 표현하는 데 필요한 "숫자"가 줄어듭니다.그렇기 때문에 가장 작은 radix인 base-2(단, 1과 0)는 항상 int의 경우 32로 매우 깁니다(위의 의사 코드에서 배열의 크기 참조).
배열의 결과 숫자는 유니코드 대신 이미지 또는 조작된 도면 함수 등을 참조하는 데 사용할 수도 있습니다.
자세한 내용: https://en.wikipedia.org/wiki/Positional_notation
저는 이 솔루션을 만들었습니다. 대신 정수를 읽고 문자열(C의 char 배열)을 읽은 다음 forboole로 쓰고, 코드는 숫자의 합도 씁니다.
// #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);
언급URL : https://stackoverflow.com/questions/3118490/getting-each-individual-digit-from-a-whole-integer
'itsource' 카테고리의 다른 글
단일 MariaDB를 Galera 클러스터로 변환 (0) | 2023.10.14 |
---|---|
-no-pie는 무엇에 사용됩니까? (0) | 2023.10.14 |
각도 2: 배열의 변화를 감지하는 방법?(@입력 속성) (0) | 2023.10.14 |
WooCommerce - get_order()가 작동하지 않습니다. (0) | 2023.10.14 |
opencv를 사용한 비디오 처리를 포함한 출력 (0) | 2023.10.14 |