我试图找到一个在数组中只使用一次的数字。

时间:2014-01-10 23:12:47

标签: c

#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;
      }

4 个答案:

答案 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 *,它是你通过控制台传递的参数列表。那是你的问题。