如何修改C语言代码统计数组负数个数与绝对值重复元素?
问题描述
需要实现两个功能:
- 统计数组中的负数个数
- 统计数组中绝对值相同的元素对数量
现有C语言代码及输入输出情况如下:
现有代码
#include<stdio.h> int main() { int n = 0; int negative_count = 0; int duplicate_count = 0; // input lenght of the array scanf("%d", &n); getchar(); int arr[n]; for(int i = 0;i < n;i++){ //input elements of the array scanf("%d", &arr[i]); getchar(); } int len = sizeof(arr) / sizeof(arr[0]); for(int i=0;i<len;i++){ if(arr[i] < 0){ negative_count++; } for(int j= i+1;j<len;j++){ if(arr[i] == arr[j]){ duplicate_count++; } } } printf("Number of negative numbers: %d\n", negative_count); printf("Number of duplicates: %d", duplicate_count); return 0; }
输入示例
5 1 -1 2 3 -3
当前输出
Number of negative numbers: 2 Number of duplicates: 0
预期目标
负数个数统计结果正确,期望绝对值相同的元素对数量为2(对应(1,-1)、(3,-3)这两组)。
解决方案
问题核心是原代码判断的是元素值完全相等,但需求是绝对值相等,需做以下修改:
- 引入绝对值函数:使用C标准库的
abs()函数计算整数绝对值,需要包含头文件<stdlib.h>(abs()定义在此头文件中)。 - 修改判断条件:将
if(arr[i] == arr[j])替换为if(abs(arr[i]) == abs(arr[j])),匹配绝对值相同的元素对。 - 优化数组长度计算:数组是通过输入的
n定义的变长数组,len的值就是n,直接用n代替sizeof(arr)/sizeof(arr[0]),代码更简洁。
修改后的完整代码
#include<stdio.h> #include<stdlib.h> // 引入abs函数所需的头文件 int main() { int n = 0; int negative_count = 0; int duplicate_count = 0; // 输入数组长度 scanf("%d", &n); getchar(); int arr[n]; // 输入数组元素 for(int i = 0;i < n;i++){ scanf("%d", &arr[i]); getchar(); } for(int i=0;i<n;i++){ if(arr[i] < 0){ negative_count++; } // 遍历i之后的元素,统计绝对值相同的元素对 for(int j= i+1;j<n;j++){ if(abs(arr[i]) == abs(arr[j])){ duplicate_count++; } } } printf("Number of negative numbers: %d\n", negative_count); printf("Number of absolute value pairs: %d", duplicate_count); return 0; }
测试结果
输入示例运行后,输出为:
Number of negative numbers: 2 Number of absolute value pairs: 2
完全符合预期需求。
内容的提问来源于stack exchange,提问作者Maz Diaz
相关产品推荐
相关产品推荐

