2017-06-23 14 views
0

プログラムはN個の整数を受け入れ、偶数の正の整数を逆にしたすべての正の整数の合計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、上記指定された2つの例えば完全に実行されます。しかし

入力用: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

arr [i] = arr [i]/10; ')は桁を反転しません。それらを逆にするには(0から99までの数字の場合)、 'rev =(arr [i]%10)* 10 + arr [i]/10;'を使うことができます。 4の場合、私が書いたコードは40を返します(それが正しいかどうかはわかりません)。 –

答えて

2

は、すべての最初は、あなたの問題のためにあなたはそれが以前の値を持っており、ごみ結果を生成するため、REV = 0を作るのを忘れて、それが問題

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

の原因になりますscanf関数で余分なスペースを使用しないようにしよう。

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) 
関連する問題