c - 三元组问题:解决它并消除错误
问题描述
#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.请快速帮助'
问题:为什么我得到浮点异常,我该如何解决?
解决方案
if(1<=n<=100000)
是错的。它在 C 中不是这样工作的。我的建议是使用逻辑和语句 ( &&
) 通过编写:
if (1 <= n && n <= 100000)
您尝试将循环限制为n
in line:for(int i=0;i<=n;i++)
但您应该使用<
sign 而不是<=
. 尝试使用:for (int i=0; i<n; i++)
将其限制为n
.
此外,当您将其限制为n
then 时,您不应使用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;
}
推荐阅读
- ios - 如何在 User-Defaults 中保存 JSON 数据
- ruby - 逐步完成黄瓜测试
- java - @PersistenceContext 不适用于参数。如何通过构造函数注入 EntityManager?
- java - 在指定路径上找不到 .jks 文件
- java - java中带有双反斜杠的正则表达式
- c# - 停止上一个任务并运行新任务 wpf
- asp.net - 使用 ASP.Net 直接打印 PDF 文件
- node.js - 使用 Typescript 在 Sequelize 模型中创建实例方法
- javascript - CSharp 和 javascript 中的 FromXmlString
- vba - exel文件中的错误行