2012-02-15 21 views
19

कहें कि मेरे पास सी में एक बहु-अंक पूर्णांक है। मैं इसे एकल-अंक पूर्णांक में तोड़ना चाहता हूं।सी: अलग-अलग चरों में एक बहु अंक संख्या को अलग करने के लिए कैसे?

1231, 2, और 3 में बदल जाएगा।

मैं यह कैसे कर सकता हूं, खासकर यदि मुझे नहीं पता कि पूर्णांक के कितने अंक हैं?

+0

विभाजन और शेष। –

+0

दशमलव अंक का मतलब '% 10' है। –

+2

यदि आपकी int ने 'char' डेटा (उपयोगकर्ता या टेक्स्ट फ़ाइल से इनपुट ...) के रूप में जीवन शुरू किया है, तो पहले स्थान पर int में कनवर्ट न करें (नहीं' स्कैनफ़', नहीं 'atoi' ...) और वर्णों का उपयोग करें अंक अलग करें। – pmg

उत्तर

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

यह एल्गोरिदम रिवर्स ऑर्डर में अंक जारी करता है ... – Matze

2

एक संकेत के रूप में, संख्या में nth अंक प्राप्त करना बहुत आसान है; द्वारा 10 एन बार विभाजित है, तो 10, या सी में आधुनिक:

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

यह nth अंक नहीं है, यह कम से कम महत्वपूर्ण –

+0

से शुरू होने वाले nth अंक हैं आप कम से कम महत्वपूर्ण अंक शून्य नहीं मानते हैं? – Dave

+3

अच्छी तरह से, मैं 123 के पहले या शून्य अंक 1, 3 नहीं मानता हूं। –

0

123 के अंतिम अंक 123% से 10 है आप 123/10 करके 123 के पिछले अंक ड्रॉप कर सकते हैं - पूर्णांक विभाजन का उपयोग करके यह आपको 12 देगा। "मुझे कैसे पता चलेगा कि आपके पास कितने अंक हैं" - ऊपर वर्णित अनुसार इसे करने का प्रयास करें और आप देखेंगे कि कब रुकना है।

5

पहले, गिनती अंक:

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; 
} 
+1

बेहतर उदाहरण तो वर्तमान उत्तर, धन्यवाद – moffeltje

0

मैं कोड में मदद मिलेगी का टुकड़ा नीचे लगता है ....

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

यदि आप सरणी का उपयोग किए बिना उसी क्रम में अंक अलग करना चाहते हैं तो इस कोड को आज़माएं।

//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

हम में 3 arguments.Here के साथ एक समारोह के रूप में इस कार्यक्रम का उपयोग कर सकते "जबकि (एक ++ < 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;} 
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)); 
} 

यह निम्न प्रिंटआउट में परिणाम:

सैकड़ों = 9

दसियों = 8

इकाइयों = 7

0

मैं इस से कोड के आधार पर किया @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]); 

} 

यह बहुत अच्छा काम करता है, धन्यवाद!

-1

आप विभाजित और जीत सकते हैं लेकिन आप सभी अंकगणितीय पुस्तकालयों को फिर से लिख सकते हैं। मैं एक बहु परिशुद्धता पुस्तकालय https://gmplib.org का उपयोग करने का सुझाव देता हूं लेकिन निश्चित रूप से यह अच्छी प्रथा है

+0

यह प्रश्न का उत्तर नहीं देता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने पर आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-कर-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/17348132) – teppic

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाले पदों/17348132) – primpap

0

आप% 10 का उपयोग कर सकते हैं, जिसका मतलब शेष है यदि आपके द्वारा विभाजित किए जाने के बाद संख्या शेष है। तो 123 % 10 3 है, क्योंकि शेष 3 है, 123 से 3 को घटाएं, फिर यह 120 है, फिर 120 के साथ 120 को विभाजित करें जो 12 है।और एक ही प्रक्रिया करो।

संबंधित मुद्दे