#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//finds the number that is used only once
void t(int c, int a[]){
int i,j;
for(i=0;i<c;i++){
for(j=i+1;j<c;j++){
if(a[i]==a[j]){
a[i]=0;
a[j]=0;
}
}
}
for(i=0;i<c;i++){
if(a[i]!=0)
printf("%d\n",a[i]);
}
}
请找到t函数中的错误,因为编译器没有显示任何错误..
这里有什么问题吗?;
if(a[i]==a[j]){
a[i]=0;
a[j]=0;
}
答案 0 :(得分:3)
如果一个数字出现三次(比如说),那么当你找到第一对时,你将它们设置为零;这意味着你找不到第三个外观。如果你知道只有一个唯一的数字,你可以计算匹配,然后存储索引,如果你通过循环并找不到匹配。
答案 1 :(得分:0)
我认为这可行:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//finds the number that is used only once
void t(int c, int a[][2]){
int i,j;
for(i=0;i<c;i++){
for(j=0;j<c;j++){
if(a[i][0]==a[j][0] && i != j){
a[i][1]=1;
}
}
}
for(i=0;i<c;i++){
if(a[i][1]==0)
printf("%d\n",a[i][0]);
}
}
int main(int argc, char * argv[])
{
int a[][2] = {{1,0},{2,0},{3,0},{4,0},{3,0},{2,0},{1,0},{3,0},{5,0},{5,0},{2,0},{3,0}};
t(12, a);
}
我添加了一个显示预期呼叫的主要内容。它确实具有在两个循环中必须从零迭代的低效率,但我不能快速地看到如何避免这种情况。
答案 2 :(得分:0)
根据您的政策进行修改。 (但是找不到零,元素被破坏)
//finds the number that is used only once
void t(int c, int a[]){
int i, j, find;
for(i=0;i<c;i++){
if(a[i]==0)
continue;
find = 0;
for(j=i+1;j<c;j++){
if(a[i]==a[j]){
find = 1;
a[j]=0;
}
}
if(find==0)
printf("%d\n", a[i]);
else
a[i] = 0;
}
}
答案 3 :(得分:-2)
您的主要功能接收的参数有误。用C语言编写的程序只接收两件事:和int变量,它是你传递的参数的数量,以及char *,它是你通过控制台传递的参数列表。那是你的问题。