3 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個贊
如果您的printf支持該'標(biāo)志(POSIX 2008要求printf()),則可以僅通過適當(dāng)?shù)卦O(shè)置區(qū)域設(shè)置來實(shí)現(xiàn)。例:
#include <stdio.h>
#include <locale.h>
int main(void)
{
setlocale(LC_NUMERIC, "");
printf("%'d\n", 1123456789);
return 0;
}
并運(yùn)行:
$ ./example
1,123,456,789
在Mac OS X和Linux(Ubuntu 10.10)上進(jìn)行了測試。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個贊
您可以按以下方式遞歸執(zhí)行此操作(請注意,INT_MIN如果使用二進(jìn)制補(bǔ)碼,則需要額外的代碼來管理它):
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);
}
總結(jié):
用戶printfcomma使用整數(shù)調(diào)用,負(fù)數(shù)的特殊情況是通過簡單地打印“-”并使數(shù)字為正數(shù)來處理(這是不能使用的位INT_MIN)。
輸入時printfcomma2,小于1,000的數(shù)字將被打印并返回。
否則,遞歸將在下一級上調(diào)用(因此將調(diào)用1,234,567,先以1,234,然后是1),直到找到小于1,000的數(shù)字。
然后將打印該數(shù)字,我們將返回遞歸樹,在打印過程中打印逗號和下一個數(shù)字。
還有一個更簡潔的版本,盡管它在檢查每個級別的負(fù)數(shù)時進(jìn)行了不必要的處理(這并不重要,因?yàn)檫f歸級別的數(shù)量有限)。這是一個完整的測試程序:
#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
一個不信任遞歸的迭代解決方案(盡管遞歸的唯一問題往往是堆??臻g,這在這里不會成為問題,因?yàn)榧词箤τ?4位整數(shù)也只有幾層深度):
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);
}
}
這兩個產(chǎn)生2,147,483,647的INT_MAX。
- 3 回答
- 0 關(guān)注
- 1073 瀏覽
添加回答
舉報