2014-07-04 35 views
0

這是我的倒數計劃。但是當我以5位數字作爲輸入時,有時候答案是正確的,肯定的,有時候是負數。顛倒5位數字給出負數

#include<dos.h> 
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 


int main() 
{ 
    clrscr(); 
    int a,b,c; 
    b=0; 
    printf("Enter the no"); 
    scanf("%d",&a); 
    c=a; 
    while(a>0) 
    { 
     b=(b*10)+(a%10); 
     a=a/10; 
    } 
    printf("\noriginal no %d",c); 

    printf("\nreversed no is %d",b); 
    getch(); 
    return 0; 
} 

如果輸入:12111
輸出:11121

輸入:22333
輸出:-32214

整數的限制是從-32768到32767,那麼爲什麼是否定的答案? 我試過使用很長,但我得到了我的反向數字爲0.

+1

如果你的'int'是2個字節,那麼你有一個特別舊的C實現。 – Bathsheba

+1

爲什麼要在數學上「倒轉」數字的艱難路線?爲什麼不只是逐個字符地反轉? – dreamlax

+1

@Bathsheba看看前幾行。對於MS-DOS,這很可能是Turbo C ...。 –

回答

3

正如Bathsheba所提到的,sizeof(int)顯然是2,並且給定您正在使用的頭文件,該平臺是MS-DOS,這意味着您的int只有16位可用信息。由於第一位是符號位,因此會留下15位,而2^15爲32768,這意味着您的範圍是-32767 .. + 32767。你想要的是unsigned int%uscanfprintf。這將允許你使用0..65535。

需要能夠處理所有的5位數字嗎?切換到long(代替簽名或無符號無關緊要,除非分別使用%ld%lu作爲簽名或無符號),並且您將有-2147483648 .. + 2147483647(帶符號)或0..4294967295(無符號),這將給你一個5位數字足夠的範圍。

如果您在使用long時出現問題,並且格式對於scanf和printf是正確的,則問題出現在您的邏輯中,而不是您至少讀取數字。

4

它看起來像這是一個16位的DOS程序?所以你的int只有16位/ 2字節,並且你的程序溢出了它。

你可以嘗試檢測時,這種情況下會發生,和/或使用unsigned避免負數或long代替int存儲更大的值(雖然這個程序仍然會輸出不正確的答案,如果你溢出)。

總體目標是什麼? - 你可以通過顛倒一個字符串來完成它嗎?

+1

最後一句是最重要的一句。如果您需要尊重一系列數字,那麼將數字轉換爲(二進制)整數並執行復雜的計算沒有意義。 – Jakub

+0

字符串方法還可以避免在輸入與'int'範圍之外的'%d'匹配的數字時發生未定義的行爲! –

+0

@adpeace我有更多的東西后,我數學倒推我的號碼。請考慮由於某種原因,我不能使用字符串(即使它在我的腦海裏)。 –

2

如果限制是32767,那麼反轉22333會產生33322,這大於限制!

如果要使用long而不是int,則還應該使用"%ld"而不是"%d"