【问题标题】:Sum of positive integers - Prints Garbage value正整数之和 - 打印垃圾值
【发布时间】:2023-11-21 11:39:01
【问题描述】:

程序必须接受 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,该程序可以完美运行。但是对于

输入: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

向我解释为什么会出现问题以及如何纠正它。

【问题讨论】:

  • 您是否使用调试器单步执行了您的程序?
  • @Jean-François Fabre:我想大约 20 个数字的总和不应产生溢出,除非某处存在错误。但没错 - 尝试不花钱。
  • 此代码 (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(我不知道这是否正确)。
  • 需要重置rev。还有"%d " --> "%d"
  • 那些日子我的心理编译器不能正常工作。我需要休息一下:)

标签: c arrays reverse garbage sum-of-digits


【解决方案1】:

您没有为每个新的偶数重置 rev = 0,因此对于偶数,反转的值是错误的。

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

【讨论】:

    【解决方案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;
        }
    

    它将解决您的问题。

    【讨论】: