आप इसे निम्नानुसार कर सकते हैं (सावधान रहें INT_MIN
यदि आप दो के पूरक का उपयोग कर रहे हैं, तो आपको इसे प्रबंधित करने के लिए अतिरिक्त कोड की आवश्यकता होगी):
void printfcomma2 (int n) {
if (n < 1000) {
printf ("%d", n);
return;
}
printfcomma2 (n/1000);
printf (",%03d", n%1000);
}
void printfcomma (int n) {
if (n < 0) {
printf ("-");
n = -n;
}
printfcomma2 (n);
}
एक सारांश:
- उपयोगकर्ता
printfcomma
एक पूर्णांक के साथ कॉल करता है , नकारात्मक संख्याओं के विशेष मामले को केवल "-" और संख्या को सकारात्मक बनाते हुए नियंत्रित किया जाता है (यह वह बिट है जो काम नहीं करेगा INT_MIN
)।
- जब आप दर्ज करते हैं
printfcomma2
, तो 1,000 से कम की संख्या सिर्फ प्रिंट और वापस आ जाएगी।
- अन्यथा पुनरावृत्ति को अगले स्तर तक कहा जाएगा (इसलिए 1,234,567 को 1,234 के साथ बुलाया जाएगा, फिर 1) जब तक कि 1,000 से कम की संख्या न मिल जाए।
- फिर उस नंबर को प्रिंट किया जाएगा और हम चलते हुए रिकर्सन ट्री को वापस करेंगे, कॉमा और अगले नंबर को प्रिंट करते हुए।
अधिक रसीला संस्करण भी है, हालांकि यह हर स्तर पर नकारात्मक संख्याओं की जांच करने में अनावश्यक प्रसंस्करण करता है (ऐसा नहीं है कि यह सीमित संख्या में पुनरावृत्ति स्तरों को बताएगा)। यह एक परीक्षण का पूरा कार्यक्रम है:
#include <stdio.h>
void printfcomma (int n) {
if (n < 0) {
printf ("-");
printfcomma (-n);
return;
}
if (n < 1000) {
printf ("%d", n);
return;
}
printfcomma (n/1000);
printf (",%03d", n%1000);
}
int main (void) {
int x[] = {-1234567890, -123456, -12345, -1000, -999, -1,
0, 1, 999, 1000, 12345, 123456, 1234567890};
int *px = x;
while (px != &(x[sizeof(x)/sizeof(*x)])) {
printf ("%-15d: ", *px);
printfcomma (*px);
printf ("\n");
px++;
}
return 0;
}
और आउटपुट है:
-1234567890 : -1,234,567,890
-123456 : -123,456
-12345 : -12,345
-1000 : -1,000
-999 : -999
-1 : -1
0 : 0
1 : 1
999 : 999
1000 : 1,000
12345 : 12,345
123456 : 123,456
1234567890 : 1,234,567,890
उन लोगों के लिए एक पुनरावृत्ति समाधान, जो पुनरावृत्ति पर भरोसा नहीं करते हैं (हालांकि पुनरावृत्ति के साथ एकमात्र समस्या स्टैक स्पेस होती है, जो यहां एक मुद्दा नहीं होगा क्योंकि यह 64-बिट पूर्णांक के लिए भी कुछ ही स्तर गहरा होगा):
void printfcomma (int n) {
int n2 = 0;
int scale = 1;
if (n < 0) {
printf ("-");
n = -n;
}
while (n >= 1000) {
n2 = n2 + scale * (n % 1000);
n /= 1000;
scale *= 1000;
}
printf ("%d", n);
while (scale != 1) {
scale /= 1000;
n = n2 / scale;
n2 = n2 % scale;
printf (",%03d", n);
}
}
इन दोनों के 2,147,483,647
लिए उत्पन्न करते हैं INT_MAX
।
उपरोक्त सभी कोड अल्प-पृथक तीन-अंकीय समूहों के लिए है, लेकिन आप अन्य वर्णों का भी उपयोग कर सकते हैं, जैसे कि एक स्थान:
void printfspace2 (int n) {
if (n < 1000) {
printf ("%d", n);
return;
}
printfspace2 (n/1000);
printf (" %03d", n%1000);
}
void printfspace (int n) {
if (n < 0) {
printf ("-");
n = -n;
}
printfspace2 (n);
}
printf()
स्वरूपित IO फ़ंक्शंस (एकल-भाव वर्ण: ') के परिवार के लिए' हजारों विभाजक 'ध्वज एक गैर-मानक ध्वज है जो केवल कुछ लाइब्रेरी कार्यान्वयन में समर्थित है। यह बहुत बुरा है कि यह मानक नहीं है।