【问题标题】:Simple C Program, Unknown output简单的 C 程序,未知的输出
【发布时间】:2015-07-23 16:32:03
【问题描述】:

问题陈述

给你一个大小为 的整数数组。您需要打印数组元素的总和。

注意:带符号的 32 位整数值使用位表示数字的符号,其余 31 位表示幅度。 32 位整数的范围是 .当我们添加几个整数值时,结果总和可能会超出此范围。您可能需要在 C/C++ 中使用long long int 或在 Java 中使用 long 数据类型来存储这些总和。

输入格式

输入的第一行包含一个整数。接下来的几行包含用空格分隔的整数来描述数组。

约束

输出格式

输出一个等于数组元素总和的单个值。

示例输入

5
1000000001 1000000002 1000000003 1000000004 1000000005`

样本输出

5000000015

我的程序

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

int main() {

    int n,i;
    scanf("%d",&n);
    long int a[5],sum;
    for(i=0;i<=n-1;i++){
        scanf("%ld %ld %ld %ld %ld",&a[1],&a[2],&a[3],&a[4],&a[5]);
    }
    for(i=0;i<=n-1;i++){
        sum = sum + a[i];
    }
    printf("%ld",sum);
    return 0;
}

错误说明

输入(标准输入):

5
1000000001 1000000002 1000000003 1000000004 1000000005

您的输出(标准输出):

140692151765426

预期输出:

5000000015

编译器消息:

Wrong Answer

【问题讨论】:

  • 你必须初始化 sum
  • 如果 a 只有 5 个元素,你就不能使用 &amp;a[5]
  • 数组索引为 0
  • 无论n 的值如何,您的代码(一旦修复索引)只会读取5 个元素。
  • long int a[5],sum=0;for(i=0;i&lt;=n-1;i++) scanf("%ld", &amp;a[i]);

标签: c arrays int long-integer


【解决方案1】:

这很好用:

#include <inttypes.h>
int main()
{
  int n,i;
  scanf("%d",&n);
  unsigned long long int a[5];
  unsigned long long int sum=0;
  for(i=0;i<n;i++)
  {
    scanf("%llu",&a[i]);
  }
  for(i=0;i<n;i++)
  {
    printf("%llu\n",sum);
    sum = sum + a[i];
  }
  printf("\nSum is : %llu",sum);
  return 0;
}

使用ll long-long 修饰符和u(无符号)转换

【讨论】:

    【解决方案2】:

    这里基本上不需要数组。只是

    #include <stdio.h>
    
    int main() {
        int n;
        scanf("%d", &n);
        long long int a, sum = 0;
        while (n--) {
            scanf("%lld", &a);
            sum += a;
        }
        printf("%lld", sum);
        return 0;
    }
    

    【讨论】:

    • 为满足 OP 的“...结果总和可能超出此范围...”,建议 long long sum = 0;
    • @chux 是的,但是 140692151765426 > 5000000015
    • @BLUEPIXY 是的,OP 的 long 肯定是 48+ 位,输出类似于 140692151765426。然而,便携式解决方案将使用 long long 来满足发布的要求。
    【解决方案3】:

    程序存在以下问题:

    1. 数组索引错误:数组大小为 5,从 0 开始,只能使用到 a[4],但对于 scanf(),它会尝试将值读取为 &a[5]。

    2. 当您使用硬编码索引 a[1]、a[2] 等时,不使用 for 循环。相反,下面的代码将更好地获取如下输入:


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

    1. 总和包括:sum = sum + a[i];

      当 i = 0 --> a[0] 将具有垃圾值,因为输入不是从用户那里获取的,因为 scanf 从 a[1] 开始。由于数组未初始化,这是未初始化的自动变量,它可能包含垃圾值,这些值将被添加到 sum 中。

    2. sum 本身也未初始化,因此它将包含垃圾值,并且对于第一次添加: sum = sum + a[0]; thsi junk value 将被添加。

    希望这能回答您对意外输出的查询。

    【讨论】:

      【解决方案4】:
      #include <cmath>
      #include <cstdio>
      #include <vector>
      #include <iostream>
      #include <algorithm>
      using namespace std;
      
      
      int main(){
          int n,i;
          cin >> n;
          long long int s=0;
          long int a[10];
          if(n>=1 && n<=10)
              {
              for(i=0;i<n;i++)
                  {
                  cin>>a[i];
                  s=s+a[i];
              }
          }
          cout<<s;
      
          return 0;
      }
      

      【讨论】:

      • 问题被标记为C,而不是C++。如果我错了,请纠正我,但C 中没有stdcincout。你还有一堆多余的(未使用的)#includes。
      【解决方案5】:
      #include <stdio.h>
      #include <string.h>
      #include <math.h>
      #include <stdlib.h>
      
      int main() {
      
          int n,i;
          scanf("%d",&n);
          long int a[10];
          long long sum=0;
          for(i=0;i<=n-1;i++){
              scanf("%ld",&a[i]);
          }
          for(i=0;i<=n-1;i++){
              sum = sum + a[i];
          }
          printf("%ld",sum);
          return 0;
      }
      

      【讨论】:

      • 请解释您的答案,为什么它可以解决问题以及与OP的代码有什么区别。谢谢:)
      猜你喜欢
      • 2021-12-26
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      相关资源
      最近更新 更多