以下為計算皆成的程式,我要怎麼把輸入的值為負的時候,他會丟正的值個函式??
我用:n=(unsigned)n;printf的時候用%u顯示 他不會進入函式...??
#include
#include
int fact(long);
int main() {
printf("輸入一個整數計算階層:");
long n;
scanf("%d",&n);
printf("%d!=%d\n",n,fact(n));
system("pause");
}
int fact(long n){
if (n==0) return 1;
else {
return n*fact(n-1);
}
}
2007-03-17 00:48:51 · 2 個解答 · 發問者 finalholy 1 in 電腦與網際網路 ➔ 程式設計
可是 我用這個的用意是 我不清楚無符號整數是怎樣使用的XDD
2007-03-17 10:11:17 · update #1
看不懂你再改什麼....
2007-03-20 23:32:08 · update #2
請問%lu是啥??
還有unsigned long n用%u顯示不就是無符號嗎
#include
#include
int main() {
unsigned long n;
printf("input a value:");
scanf("%u",&n);
printf("%u\n",n);
system("pause");
} 輸入負數
不能??
2007-03-20 23:37:18 · update #3
你這樣列你想我會看的懂嗎XD
2007-03-20 23:38:42 · update #4
使用時,你一樣把它 + - * / = ... 完全一樣。
你也可以:
unsigned i;
i = -1
在 32 位元的 CPU 下,它會是 4294967295,多數的 compiler 不會出現錯誤。
有的 compiler 會有警告。
為什麼他會是4294967295??
2007-03-22 23:46:45 · update #5
dev c++單單顯示-20沒有出現警告,且會顯示4294967295 可是不知道為什麼??可是如果顯示多個的話int main() {
unsigned i;
i=-20;
printf("%u\n",i);
i=20;
printf("%u\n",i);
i=*20;
printf("%u\n",i);
i=/20;
printf("%u\n",i);
i=+20;
printf("%u\n",i);
system("pause"); 在-20那邊就無法編譯,只有+20,20能正常編譯
2007-03-22 23:53:06 · update #6
只列出你要改的地方如下:
寫的是最簡單改法,不是最佳改法。
in fact,
unsigned long fact(unsigned long n)
in main,
long n;
scanf("%lu", &n);
printf("%u! = %\n", n, fact(n));
2007-03-21 21:27:41 補充:
會丟正的值〝個〞函式
是啥?
顯示不就是無符號嗎
??
int n;
if (n < 0) n = -n;
階乘長大得很快!
約 15 就超過 int 的範圍
約 22 就超過 long 的範圍(詳細數值沒背,只記得遠小於50。)
所以,你輸入的值大一點點時,這個程式就又不能算了。
若你只要算個大概,可以把型態改為 double 或 long double,約可以算到 130 左右,但只有前 10 位數左右是對的。
printf 蠻神奇的就是:它不用分
long 還是 int!
unsigned long 還是 unsigned!
scanf 要分!!
2007-03-21 22:07:41 補充:
無號整數和整數在 C 的差別:
1. 宣告時:unsigned 和 int
2. 上下限:42百萬 ~ 0 和 21百萬 ~ -21百萬(註:指32位元電腦)
3. 多數的 CPU下,int 運算比 unsigned 快。
4. printf / scanf時,unsigned 是 u,int 是 d。
5. (小型) 整數常數 default 是 int。
如:120 雖然可以是 char, int, unsigned, unsigned char, unsigned long, float, double, long doulbe 任一種型別,但因為你沒指定它是哪一種,C規定:它是 int。
2007-03-21 22:11:31 補充:
6. << 或 >> 時:忘了有沒有不同,要查一下。
其它應該是沒有差別了。
使用時,你一樣把它 + - * / = ... 完全一樣。
你也可以:
unsigned i;
i = -1
在 32 位元的 CPU 下,它會是 4294967295,多數的 compiler 不會出現錯誤。
有的 compiler 會有警告。
2007-03-21 22:12:41 補充:
記錯了。
上下限是 42億 ~ 0 和 21億 ~ -21億
2007-03-23 10:43:42 補充:
int / unsigned 在 C 的定義是 CPU 的 位元數。
所以, 32 位元的 CPU,int/ unsigned 是 32 長。
2^32 = 4294967296
但它從 0 開始,所以要 -1 = 4294967295
=* 和 =/ 是錯誤的,當然不能編譯
= 20 和 = 20 一定可以編譯
= -20 要看 compiler 有沒有檢查 unsigned 不能 < 0
有的有檢查,有沒有。
2007-03-23 10:49:23 補充:
縮小一點來看比較好懂。
如果你只有一位(十進位)數字。那當然只能表示 0 ~ 9 這10種變化。
3 - 5 = -2,抱歉,沒有可以記 - 的地方!
那,你要記 2 還是記 8 呢?
如果記 2,把 5 加回去變成 2 5 = 7 不等於 3!
如果記 8,把 5 加回去變成 8 5 = 13沒地方記 10 只記了 3 等於原來的 3 耶!
也就是說:記 8 比記 2 好處多一點點。
8 怎麼來?
10 - 2 = 8
2007-03-23 10:51:19 補充:
一樣。
4294967296 類比 10 = 0 (如果只有一位數)
4294967295 類比 10 - 1 = 0 - 1 = -1
9 1 = 10 => 0
4294967295 1 = 4294967296 = 0
2007-03-17 23:20:57 · answer #1 · answered by ? 7 · 0⤊ 0⤋
使用絕對值函式可以輕鬆做到,例如:
abs(n);
n就變成正數了
2007-03-17 05:53:22 · answer #2 · answered by Fanta 2 · 0⤊ 0⤋