2017-06-23 139 views
0

程序必須接受N個整數,並打印所有POSITIVE整數的總和S,並將偶數正整數反轉。正整數之和 - 打印垃圾值

實施例輸入/輸出1:

輸入:4 39 -8 57 24

輸出:138

說明:總和= 39 + 57 + 42 = 138(偶數24相反)

示例輸入/輸出2:
輸入:3 -23 -11 -445

輸出:0

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

int main() 
{ 
int n,i,arr[100000],count=0,rem,rev=0; 

scanf("%d",&n); 
for(i=0;i<n;i++) 
{ 
    scanf("%d ",&arr[i]); 
} 

for(i=0;i<n;i++) 
{ 
    if(arr[i]>0) 
    { 
     if(arr[i]%2==0) 
     { 
      while(arr[i]!=0) 
      { 
       rem=arr[i]%10; 
       rev=rev*10+rem; 
       arr[i]=arr[i]/10; 
      } 
      count=count+rev; 
     } 
     else 
     { 
      count=count+arr[i]; 
     } 

    } 
} 
printf("%d",count); 

} 

該程序運行完全用於上述兩個指定例的I/O。但對於

輸入:32

-89 90 -13 27 63 72 -17 33 58 73 -55 -46 -64 -65 87 62 -76 -13 -50 6 22 70 87 -39 -24 98 -31 -6 39 -80 46 -54

輸出:-878418008

向我解釋爲什麼會出現這個問題,如何糾正它。

+0

你是否已經通過調試器完成了你的程序? –

+0

@ Jean-FrançoisFabre:我想大約20個數字的總和不應該產生溢出,除非在某個地方存在錯誤。但是正確的 - 嘗試沒有任何成本。 –

+0

此代碼('rem = arr [i]%10; rev = rev * 10 + rem; arr [i] = arr [i]/10;')不反轉數字。要反轉它們(在數字從0到99的情況下),你可以使用'rev =(arr [i]%10)* 10 + arr [i]/10;'。在4的情況下,我寫的代碼返回40(我不知道這是否正確)。 –

回答

2

首先是儘量不要用在scanf額外的空間,就會造成問題

for(i=0;i<n;i++){ 
scanf("%d",&arr[i]);} 

那麼對於你的問題,你忘了讓REV = 0這樣它會前值和產生的垃圾結果。

if(arr[i]%2==0) 
    { 
     rev=0; 
     while(arr[i]!=0) 
     { 
      rem=arr[i]%10; 
      rev=rev*10+rem; 
      arr[i]=arr[i]/10; 
     } 
     count=count+rev; 
    } 

它會解決你的問題。

3

對於每個新的偶數,您都沒有重置rev = 0,因此偶數的反向值是錯誤的。

if(arr[i]>0) 
{ rev = 0; 
    if(arr[i]%2==0)