查找在数组中出现两次的数字

时间:2018-10-07 15:17:48

标签: c arrays repeat

我必须编写一个程序,其中用户输入数字 n ,然后输入范围[1,n]中的 n +1个数字,其中一个这些数字中不止一次发生。程序返回多次出现的数字。

例如,如果输入是这样的:

3
1
2
3
2

then n = 3,其余输入为[1,3]范围内的四个数字,而输出为2(因为该数字比一次)。

我不允许使用向量。

我认为我可以这样:

#include <stdio.h>

int main(){
    int i,n,nr,x,num,aux,k;
    scanf("%d", &n);
    nr = 0;
    for (i=0; i < n+1; i++)
    {
        scanf("%d", &num);
        nr = nr * 10 + num; 
    }
    k=1;
    while(k!=2){
        aux=nr%10;
        nr=nr/10;
        x=nr;
        while (x>0){
            x=x/2;
            if (aux==x%10){
                printf("Numarul este %d", aux);
                k=2;
                break;
            }
        }
    }
    return 0;
}

但这仅适用于一位数字,因为我要乘以10。如果我想支持更大的数字,我可以乘以更大的数字,但是nr会变得太大。

所以:我如何支持大于10的数字?

3 个答案:

答案 0 :(得分:2)

我知道我应该怎么做。从一开始就很简单,但认为很难。 如果我必须在[1,n]间隔中输入数字,并且有n + 1个数字,则它们的总和为n(n + 1)/ 2 +重复的数字。 “随机”一词杀死了我的大脑。 重复的数字(在我的老师的要求下,只有一个)等于总和,当您读取数字时,您会在循环中执行此操作,然后将数字总和从1减去n。 谢谢大家的回答,如果我的答案不清楚,请看下面的代码。

#include <stdio.h>
int main(){
    int i, n, sum, nr, rep, k;
    k=0;
    sum=0;
    scanf("%d", &n);
    for (i=0; i<=n; i++){
        scanf("%d", &nr);
        if (nr>n){
            k=1;
            break;
        }
        sum = sum + nr;
    }
    if (k==1){
        printf("Introduceti doar numere in intervalul 1, %d \n", n);
    } else{
    rep = sum - (n*(n+1))/2;
    printf("Numarul %d se repeta\n", rep);
    }
    return 0;
}

答案 1 :(得分:1)

您可以在O(n)中执行此操作,而无需额外的空间或计数器。 您可以将访问次数修改为负数。如果数字为负数,则遍历时,则数字是重复的。

package config

import com.typesafe.config.ConfigFactory

object settings {
  private val config=ConfigFactory.load()

  object WebLogGen {
    private val weblogGen = config.getConfig("clickstream")

    lazy val records = weblogGen.getInt("records")
    lazy val timeMultiplier = weblogGen.getInt("time_multiplier")
    lazy val pages = weblogGen.getInt("pages")
    lazy val visitors = weblogGen.getInt("visitors")
    lazy val filepath = weblogGen.getString("file_path")
  }
}
在您的示例中, 如果i = 0,则通过反转符号使该元素成为已访问元素;

 void returnDuplicate(int[] arr)
 {
   int n = arr.length;
   for(int i=0;i<n;i++)
   {
    if(arr[arr[i]-1]>0)
    {
      arr[arr[i]-1]= -arr[arr[i]-1];
    }
    else 
    {
     print arr[i];
     return;
    }
  }
}

答案 2 :(得分:0)

您需要由用户指定大小的数组并填充它:

int n;
scanf("%d", &n);
int a[n];

for (i=0; i < n; i++)
{
    scanf("%d", &a[n]);
}

现在您需要遍历数组:

  • 采用第一个元素

  • 检查以下所有元素是否存在

  • 如果是,就完成了

  • 如果否,则取下一个元素,依此类推。

这听起来像是作业,我不会给您这个循环。用C编写起来应该很容易。