3 回答

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

TA貢獻2021條經驗 獲得超8個贊
您可以按以下方式遞歸執行此操作(請注意,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
一個不信任遞歸的迭代解決方案(盡管遞歸的唯一問題往往是堆??臻g,這在這里不會成為問題,因為即使對于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。
- 3 回答
- 0 關注
- 1050 瀏覽
添加回答
舉報