2012-02-15 73 views
19

Giả sử tôi có một số nguyên nhiều chữ số trong C. Tôi muốn chia nó thành các số nguyên một chữ số.C: làm cách nào để chia nhỏ số nhiều chữ số thành các biến riêng biệt?

123 sẽ chuyển thành 1, 23.

Làm cách nào để tôi thực hiện việc này, đặc biệt nếu tôi không biết số nguyên có bao nhiêu chữ số?

+0

Chia và phần còn lại. –

+0

Chữ số thập phân có nghĩa là '% 10'. –

+2

Nếu int của bạn bắt đầu cuộc sống dưới dạng dữ liệu 'char' (đầu vào từ người dùng hoặc tệp văn bản ...) không chuyển thành int ở vị trí đầu tiên (không có' scanf', không có 'atoi' ...) và sử dụng các ký tự tách các chữ số. – pmg

Trả lời

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

thuật toán này phát các chữ số theo thứ tự ngược lại ... – Matze

2

Như một gợi ý, việc nhận số thứ n trong số này khá dễ dàng; chia cho 10 n lần, sau đó mod 10, hoặc trong C:

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

đây không phải là chữ số thứ n, đây là chữ số thứ n bắt đầu từ số ít quan trọng nhất –

+0

Bạn không coi chữ số ít quan trọng nhất là số không? – Dave

+3

tốt, tôi xem xét các chữ số đầu tiên hoặc số 0 của 123 là 1, không phải là 3. –

0

Các chữ số cuối cùng của 123 là 123% 10. Bạn có thể thả các chữ số cuối cùng của 123 bằng cách làm 123/10 - sử dụng phân chia số nguyên này sẽ cung cấp cho bạn 12. Để trả lời câu hỏi của bạn về "làm cách nào để biết số lượng chữ số bạn có" - hãy thử làm như mô tả ở trên và bạn sẽ biết cách dừng khi nào.

5

Thứ nhất, đếm các chữ số:

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

Sau đó, bạn có thể lưu trữ chúng trong một mảng:

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

Ví dụ tốt hơn thì câu trả lời hiện tại, nhờ – moffeltje

0

Tôi nghĩ bên dưới đoạn mã sẽ giúp ....

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; 
} 
0

Hãy thử mã này nếu bạn muốn tách các chữ số theo cùng thứ tự mà không sử dụng mảng.

//Separate number digits 
#include <stdio.h> 
#include <math.h> 

void main() 
{ 
    int x, y, n = 0; 

    scanf("%d", &x); 

    //counting digits 
    y = x; 
    while (y != 0) 
    { 
     n += 1; 
     y /= 10; 
    } 

    //printing separated digits 
    int i; 
    for (i = ceil(pow(10, (n - 1))); i != 0; i /= 10) 
     printf("%d ", (x/i) % 10); 
} 
0

chúng ta có thể sử dụng chương trình này như một chức năng với 3 arguments.Here trong "trong khi (a ++ < 2)", 2 là số chữ số bạn cần (có thể cung cấp như một đối số) thay thế 2 với không của chữ số bạn cần. Ở đây chúng ta có thể sử dụng "z/= pow (10,6)" nếu chúng ta không cần các chữ số cuối cùng, thay thế 6 bằng số chữ số bạn không cần (có thể đưa ra như một đối số khác), và đối số thứ ba là số bạn cần phải phá vỡ.

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;} 
0
//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)); 
} 

Điều này dẫn đến các bản in sau:

Hàng trăm = 9

Hàng chục = 8

Units = 7

0

Tôi làm điều này dựa trên mã từ @asaelr:

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

digitsArrayPlusNumber *splitDigits (uint32_t inValue) { 
    // based on code from [email protected] 

    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]); 

} 

Nó hoạt động khá tốt, cảm ơn!

-1

Bạn có thể chia và chinh phục nhưng bạn đã viết lại tất cả thư viện số học. Tôi khuyên bạn nên sử dụng thư viện có độ chính xác cao https://gmplib.org Nhưng tất nhiên, thực hành tốt là

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (https://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (https://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ review/low-quality-posts/17348132) – teppic

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17348132) – primpap

0

Bạn có thể sử dụng% 10, có nghĩa là số còn lại nếu số sau khi bạn chia. Vì vậy, 123 % 10 là 3, bởi vì phần còn lại là 3, trừ 3 từ 123, sau đó là 120, sau đó chia 120 với 10 là 12.Và làm quá trình tương tự.

Các vấn đề liên quan