programing

C: 다자리 숫자를 별도의 변수로 분할하는 방법은?

jooyons 2023. 11. 1. 22:21
반응형

C: 다자리 숫자를 별도의 변수로 분할하는 방법은?

내가 C로 여러 자리 정수를 가지고 있다고 치자.한 자리 정수로 나누고 싶습니다.

123로 변할 것입니다.1,2,그리고.3.

특히 정수가 몇 자리인지 모르는 경우에는 어떻게 해야 합니까?

int value = 123;
while (value > 0) {
 int digit = value % 10;
 // do something with digit
 value /= 10;
}

먼저 숫자를 세어 봅니다.

unsigned int count(unsigned int i) {
 unsigned int ret=1;
 while (i/=10) ret++;
 return ret;
}

그런 다음 배열로 저장할 수 있습니다.

unsigned int num=123; //for example
unsigned int dig=count(num);
char arr[dig];
while (dig--) {
 arr[dig]=num%10;
 num/=10;
}

힌트로 n번째 숫자를 숫자로 구하는 것은 매우 쉽습니다. 10n번으로 나눈 다음 mod 10 또는 C:

int nthdig(int n, int k){
     while(n--)
         k/=10;
     return k%10;
}

123의 끝자리는 123% 10입니다.123/10 을 수행하면 끝자리 123 을 떨어뜨릴 수 있습니다. 정수 나눗셈을 사용하면 12가 됩니다."당신이 몇 자리의 숫자를 가지고 있는지 어떻게 알 수 있나요?"에 대한 질문에 답하려면 위에서 설명한 대로 해보세요. 그러면 언제 멈춰야 하는지 알 수 있을 것입니다.

아래의 코드가 도움이 될 것 같습니다.

temp = num;
while(temp)
{
    temp=temp/10;
    factor = factor*10;
}

printf("\n%d\n", factor);
printf("Each digits of given number are:\n");

while(factor>1)
{
    factor = factor/10;
    printf("%d\t",num/factor);
    i++;
    num = num % factor;
}
//Based on Tony's answer
#include <stdio.h> 
int nthdig(int n, int k){
    while(n--)
        k/=10;
    return k%10;
}

int main() {
    int numberToSplit = 987;
    printf("Hundreds = %i\n",nthdig(2, numberToSplit));
    printf("Tens     = %i\n",nthdig(1, numberToSplit));
    printf("Units    = %i\n",nthdig(0, numberToSplit));
}

그러면 다음과 같은 인쇄물이 나옵니다.

수백 = 9

십 = 8

단위 = 7

@asaelr의 코드를 바탕으로 만들었습니다.

typedef struct digitsArrayPlusNumber {
    uint32_t *baseAddress;
    uint32_t number;
} digitsArrayPlusNumber;

digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
    // based on code from asaelr@stackoverflow.com

    uint32_t inputValue = inValue;

    //Count digits

    uint32_t theCount = 1;
    while (inputValue /= 10)
        theCount++;

    // put in array
    uint32_t *arr = malloc(sizeof(uint32_t) * theCount);
    uint32_t dig = theCount;
    while (dig--) {
        arr[dig]=inValue % 10;
        inValue /= 10;
        //  printf ("%d\n", arr[dig]);
    }

    digitsArrayPlusNumber *dandn = malloc (sizeof(digitsArrayPlusNumber));

    dandn->baseAddress = arr;
    dandn->number = theCount;

    return dandn;

}

int main(int argc, const char * argv[]) {


    for (int d = 0; d < splitDigits(12345678)->number; d++)
        printf ("%u\n", (splitDigits(12345678)->baseAddress)[d]);

}

잘 작동합니다, 감사합니다!

%10 을 사용할 수 있는데, 이는 나눈 뒤의 숫자가 나머지를 의미하기 때문에123 % 10는 3이고 나머지는 3이므로 123에서 3을 뺀 다음 120이고 120을 10으로 나눈 다음 12입니다.그리고 똑같은 과정을 합니다.

        //This is c#, but you can see how easy it would be to convert
        //to another language.

        int myNumber = 123456;
        string myWord = Convert.ToString(myNumber);

        string partOne = myWord.Substring(0, 2);
        string partTwo = myWord.Substring(2, 2);
        string partThree = myWord.Substring(4, 2);

        int num01 = Convert.ToInt32(partOne);
        int num02 = Convert.ToInt32(partTwo);
        int num03 = Convert.ToInt32(partThree);

        Console.WriteLine(num01);
        Console.WriteLine(num02);
        Console.WriteLine(num03);

        Output:
        12
        34
        56

우리는 이 프로그램을 3개의 인수를 가진 함수로 사용할 수 있습니다.여기서 "while(a++<2)"에서 2는 필요한 자릿수입니다(하나의 인수로 제공 가능). 2를 필요한 자릿수가 아닌 자릿수로 바꿉니다.여기서 우리는 "z/=pow(10,6)"을 사용할 수 있습니다. 만약 우리가 마지막 특정 숫자가 필요 없다면, 6을 필요 없는 숫자의 숫자로 바꿀 수 있습니다(다른 인수로 줄 수 있습니다). 그리고 세 번째 인수는 당신이 깨야 할 숫자입니다.

int main(){
long signed c=0,z,a=0,b=1,d=1;
scanf("%ld",&z);
while(a++<2){
       if(d++==1) 
       z/=pow(10,6);
       c+=(z%10)*b; 
       z/=10;
       b*=10;}
        return c;}

분할하여 정복할 수 있지만 산술 라이브러리를 모두 다시 작성할 수 있습니다.저는 고정밀 라이브러리를 사용하는 것을 제안합니다. https://gmplib.org 하지만 물론 좋은 연습입니다.

언급URL : https://stackoverflow.com/questions/9302681/c-how-to-break-apart-a-multi-digit-number-into-separate-variables

반응형