如何在putchar
的幫助下打印整數。我想在不使用外部存儲的情況下做到這一點。
這個問題在去年的一次採訪中被問到。可以putchar打印一個整數嗎?
回答
當面對面試的模糊要求時,表達您的假設是個好主意。
我會採取只能夠使用putchar
的要求,這意味着它是我允許調用的唯一庫函數。我還會假設「沒有外部存儲」意味着我不能明確地創建緩衝區。如果面試官跟我的假設一致,我會繼續:
void pr_int(int n) {
if (n < 0) {
putchar('-');
n = -n;
}
if (n/10 != 0)
pr_int(n/10);
putchar((n % 10) + '0');
}
如果面試官接着評論說,n = -n;
會失敗INT_MIN
,如下所述,那麼我將它改寫爲:
void pr_uint(unsigned int n) {
if (n/10 != 0)
pr_uint(n/10);
putchar((n % 10) + '0');
}
void pr_int(int n) {
if (n < 0) {
putchar('-');
n = -n;
}
pr_uint((unsigned int) n);
}
對於INT_MIN,n = -n將失敗。 – 2012-08-15 19:40:32
+1 @ H2CO3:但是'n = -n;'**可能**失敗。 C標準允許在不失敗的情況下執行:-) – pmg 2012-08-15 20:04:52
@pmg當然:) – 2012-08-15 20:31:52
爲什麼downvote? – 2012-08-15 20:41:25
我剛剛裝配了一些可怕的東西。這主要是概念驗證,它是真的很可怕,只適用於正整數,但幾乎不使用存儲。啊,整數也不能太大,它可能是越野車。
#include <stdio.h>
#include <assert.h>
int main()
{
const int max_precision = 100000;
int b = 7414;
int max = b * max_precision;
assert(b > 0);
while (b <= max && b >= 0)
{
putchar('0' + (b/max_precision) % 10);
b *= 10;
}
putchar('\n');
}
max_precision
設置將打印多少位數。 b
存儲實際的數字,max
用於終止循環(無論是那個還是整數溢出)。
正確回答這個問題很大程度上取決於「外部存儲」和「僅限於putchar
」的含義。
void print_int_r (int x, int neg) {
int y = x/10;
int d = x%10;
if (y) print_int_r(y, neg);
putchar('0' + (neg ? -d : d));
}
void print_int (int x) {
int neg = x < 0;
if (neg) putchar('-');
print_int_r(x, neg);
putchar('\n');
}
上面實現假定C99語義,如C99 6.5.5節描述的p6:
當整數之分,
/
操作的結果是具有丟棄任何小數部分代數商。如果商a/b
可表示,則表示(a/b)*b + a%b
應等於a
。
但是,%
的ANSI C(C 89)語義更糟糕。 ANSI C第3.3節。5 P5說:
如果操作數爲負,
/
操作的結果是否大於代數商或最小整數小於代數商較大者的最大整數是實現定義,爲是符號%
運營商的結果。
Ferruccio的第二個答案几乎是完美的。問題是轉換不正確。如果操作的結果是不能由int
表示的值,則n = -n
的結果未定義。所以,轉換應該這樣完成:
void pr_int(int n) {
if (n < 0) {
putchar('-');
pr_uint(-(unsigned int)n);
} else
pr_uint(n);
putchar('\n');
}
而且該解決方案現在符合所有ISO C標準。細節可以找到here。
- 1. 這可以打印在同一行嗎?
- 2. Python可以打印函數定義嗎?
- 3. 如何使用putchar打印浮點值?
- 4. 打印浮點數時可以減少'.00',可以保存整個數字
- 5. 編寫打印所有的整數的,一個整數整除
- 6. 爲什麼dataframe.shape [0]打印一個整數,但dataframe.columnname.shape打印一個元組
- 7. 可以在Grails 1.3.7中打印JSON嗎?
- 8. 可以javafx打印到點陣打印機嗎?
- 9. 使用putChar後,haskell-mode在同一行打印「* Main>」?
- 10. 使用putchar()和getchar()打印單個字符
- 11. 打印整個jtable
- 12. typedef int - >整數。我可以做cout->在C++中打印嗎?
- 13. 只打印整數?
- 14. 打印的整數
- 15. 如何打印整個WebView(可滾動)?
- 16. 可以加密整數嗎?
- 17. 我可以從兩個整數中設置一個double嗎?
- 18. 在一組按鈕中打印一個整數數組,Swift
- 19. 是否可以打印一個雙精度浮點數
- 20. 打印出可以除以
- 21. 按位數打印整數
- 22. 我可以強制Outlook 2007規則僅打印第一頁嗎?
- 23. 我可以用bisect打印一行的內容嗎?
- 24. 這個Java程序可以打印非零值嗎?
- 25. 這個打印可以在Flash/Java中完成嗎?
- 26. 您可以確定Crystal Report將打印的頁數嗎?
- 27. 我們可以在Python中使用return來打印函數嗎?
- 28. 在C中打印整數char整數
- 29. 同時打印多個整數
- 30. 在C#中用{#}打印整個數字?
順便說一下,這位採訪者是否認爲你正在爲2013年的IOCCC做準備? – 2012-08-15 19:47:43
「不使用外部存儲器」是什麼意思? – 2012-08-15 20:43:49
@MichaelBurr @MichaelBurr我認爲面試官的意思是不使用變量,我也很困惑 – akash 2012-08-16 05:24:12