首页 > 解决方案 > 三元组问题:解决它并消除错误

问题描述

#include<stdio.h>
#include<stdbool.h>
#include<malloc.h>
// function called
long long good_triplets (int* arr, int n) {
    int count=0;
    if(1<=n<=100000)
    {
        for(int i=0;i<=n;i++)
        {
            if((((arr[i]+arr[i+1]+arr[i+2])%arr[i  ])==0) &&
               (((arr[i]+arr[i+1]+arr[i+2])%arr[i+1])!=0) && 
               (((arr[i]+arr[i+1]+arr[i+2])%arr[i+2])!=0) )
               count=count + 6;
            if((((arr[i]+arr[i+1]+arr[i+2])%arr[i+1])==0) &&
               (((arr[i]+arr[i+1]+arr[i+2])%arr[i  ])!=0) &&
               (((arr[i]+arr[i+1]+arr[i+2])%arr[i+2])!=0) )
               count=count + 6;
            if((((arr[i]+arr[i+1]+arr[i+2])%arr[i+2])==0) &&
               (((arr[i]+arr[i+1]+arr[i+2])%arr[i+1])!=0) && 
               (((arr[i]+arr[i+1]+arr[i+2])%arr[i])!=0) )
               count=count + 6;
        }
    }
   return count;
}
//main funtion
int main() {
    int n;
    scanf("%d", &n);
    int i_arr;
    int *arr = (int *)malloc(n * sizeof(int));
    for(i_arr=0; i_arr<n; i_arr++)
        scanf("%d", &arr[i_arr]);
    long long out_ = good_triplets(arr, n);
    printf("%lld", out_);
}

'删除浮点异常'
'这是一个黑客地球'
'1.删除浮点异常
2.请快速帮助'
问题:为什么我得到浮点异常,我该如何解决?

标签: c

解决方案


if(1<=n<=100000)是错的。它在 C 中不是这样工作的。我的建议是使用逻辑和语句 ( &&) 通过编写:

if (1 <= n && n <= 100000)

您尝试将循环限制为nin line:for(int i=0;i<=n;i++)但您应该使用<sign 而不是<=. 尝试使用:for (int i=0; i<n; i++)将其限制为n.

此外,当您将其限制为nthen 时,您不应使用arr[i+1]or arr[i+2],因为您正在访问数组边界之外的值(来自数组之后的内存)。这是该异常的原因。如果您有一些非零垃圾,那么您的代码很可能不会有浮点异常。因为您正在使用arr[i+1]andarr[i+2]进行模运算,并且在某种程度上它们可能为零,所以根据标准,您可以有未定义的行为。

尝试使用(根据您的代码;我不知道它的用途):

long long good_triplets(int *arr, int n) {
  int count = 0;
  if (3 <= n && n <= 100000) {
    for (int i = 0; i < (n - 2); i++) {
      if ((((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i]) == 0) &&
          (((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i + 1]) != 0) &&
          (((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i + 2]) != 0))
        count = count + 6;
      if ((((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i + 1]) == 0) &&
          (((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i]) != 0) &&
          (((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i + 2]) != 0))
        count = count + 6;
      if ((((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i + 2]) == 0) &&
          (((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i + 1]) != 0) &&
          (((arr[i] + arr[i + 1] + arr[i + 2]) % arr[i]) != 0))
        count = count + 6;
    }
  }
  return count;
}

推荐阅读