【问题标题】:What is the problem with the logic of the code?代码逻辑有什么问题?
【发布时间】:2020-10-31 01:13:22
【问题描述】:

我一直在尝试用 C++ 解决这个简单的问题,但每次我提交时,它都会给出错误的答案。我很确定我的逻辑是正确的。任何帮助表示赞赏。

问题:求输入数字之间的距离之和。

例如。输入:2 5 8 2 1
距离=2+2+5+0 =9, (1

PS:输入不能连续有相同的数字。
PSS:子任务二给出了错误的答案

代码:

#include <iostream>
using namespace std;

int main() {
    // your code goes here

    int t,a[100000],n,sum=0;

    cin>>t;

    for(int i=0;i<t;i++)
    {
        cin>>n;
        
        for(int j=0;j<n;j++)
        {
            cin>>a[j];
        }
        for(int j=0;j<n-1;j++)
        {
            if(a[j]!=a[j+1])
            {
                sum = sum + abs(a[j]-a[j+1])-1;
            }
       }
        cout<<sum<<endl;
        sum=0;   
    }
}

【问题讨论】:

标签: c++ logic cc


【解决方案1】:

您的代码的问题是您使用int 类型作为sum 的最大值(1E11)可以超过int 的上限(如果它是32 位或更少)。请改用 long long(atleast 64-bit) 来存储您的总和。

好吧,您还可以优化代码,因为您并不完全需要 100000 整数数组并将值存储在其中。您只需使用两个变量即可。

这是您的逻辑的修改实现:

#include <iostream>

int main() {
    int t, n, first, second;
    long long sum; // or better use std::int_fast64_t sum;
    std::cin >> t;
    while (t--) {
        sum = 0;
        std::cin >> n >> first;
        for (int i = 0; i < n - 1; ++i) {
            std::cin >> second;
            sum += std::abs(first - second) - 1;
            first = second;
        }
        std::cout << sum << std::endl;
    }
}

PS:在竞争性编码中,检查提供的约束(如if(a[j]!=a[j+1]))是没有用的。问题陈述只是保证它永远不会是false

【讨论】:

  • 请改用std::int64_tintlonglong long 的确切大小未指定。
  • @ThomasSablik 在代码中添加了这一点。顺便说一句,除非您想要固定宽度,否则这并不重要,而在这个特定问题中您不需要。在这种情况下,整数必须至少 64 位才能保存sum,并且标准保证long long 将满足该要求,即它至少为64 位。所以,我之前发布的代码也可以正常工作。
  • 如果 OP 使用 std::int32_t 而不是 int,则问题会提前一小时得到回答。
  • @ThomasSablik 实际上我早在 1 小时前就已经回答了(只要他在 cmets 中提供了问题链接)! :)
  • 您在提出问题 30 分钟后发表了评论。如果 OP 使用了std::int32_t,第一条评论将在不到 5 分钟后回答问题。而您的评论是“尝试更改...”,因为您仍然无法确定。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2017-11-15
  • 2011-10-30
相关资源
最近更新 更多