2017-06-23 428 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)