#include<stdio.h>
int main(void)
{
int a,b,i,j,num=0,sum=0,nums[100],N;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d ",&nums[i]);
}
for(i=0;i<N;i++)
{
for(j=i+1;j<N;j++)
{
if(nums[i]==nums[j])
{//num++;
a+=nums[i];
b=nums[i];
a=a+b;
}
}
}
for(i=0;i<N;i++)
{
sum+=nums[i];
}
sum=sum-a;
printf("%d",sum);
return 0;
}
问大家一个C语言问题,为什么我的代码出错?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
从你提供的代码来看,你的思路是通过两层循环找出重复的元素,并试图从中计算出唯一元素的总和。但是,这段代码存在一些逻辑上的错误,导致它无法正确地计算出唯一元素的和。
首先,变量
a
和b
的使用方式不太恰当。在你的代码中,a
被用来累加重复元素的值,但这个累加过程并不正确,因为一旦找到重复元素,a
就会被不断更新,而不是保留所有重复元素的总和。同时,b
的使用也显得多余,因为它仅仅被赋值为当前的重复元素,但并没有在后续的代码中起到任何作用。其次,你的代码没有考虑到每个重复元素可能会被多次检测到的情况。例如,如果数组中有三个相同的元素,那么在第一次检测到重复后,
a
会增加两次该元素的值,但在第二次检测到重复时,a
又会再次增加两次该元素的值,这样就导致了重复元素的值被过度减去。为了修正这些问题,你可以使用一个辅助数组来记录每个元素出现的次数,然后遍历这个辅助数组,将出现次数为1的元素加到最终结果中。下面是修改后的代码示例:
#include <stdio.h> int main(void) { int N, i, j, count[10000] = {0}, sum = 0; scanf("%d", &N); // Read input and count occurrences for(i = 0; i < N; i++) { int num; scanf("%d", &num); count[num + 5000]++; } // Calculate sum of unique elements for(i = 0; i < 10000; i++) { if(count[i] == 1) { sum += (i - 5000); // Assuming the numbers are in the range [-5000, 4999] } } printf("%d", sum); return 0; }
这里假设了输入的整数范围在
[-5000, 4999]
之间,因此使用了一个长度为10000的数组count
来存储每个元素的出现次数(将负数转换为正数索引)。如果输入数据的范围不同,你需要相应调整辅助数组的大小和偏移量。这个版本的代码应该能更准确地计算出数组中唯一元素的和。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
- ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
- ¥15 FileNotFoundError 解决方案
- ¥15 uniapp实现如下图的图表功能
- ¥15 u-subsection如何修改相邻两个节点样式
- ¥30 vs2010开发 WFP(windows filtering platform)
- ¥15 服务端控制goose报文控制块的发布问题
- ¥15 学习指导与未来导向啊
- ¥15 求多普勒频移瞬时表达式
- ¥15 如果要做一个老年人平板有哪些需求