【问题标题】:How to find the missing number without using arrays?如何在不使用数组的情况下找到丢失的数字?
【发布时间】:2019-09-24 08:34:24
【问题描述】:

我必须在一个数字序列中找到一个缺失的数字。 输入包含一个介于 0 和 35000 之间的正整数 n,以及范围为 [0..n] 的 n 个唯一数字。 (所以这个范围包含 n+1 个数字)。

我已经用sum={n*(n+1)}/2misNum=sum-SumOfNum; 尝试了一些东西,但我找不到让这个工作的方法。

我写了一些代码,但没有使用我之前提到的示例。很明显,这段代码是不完整的,但我不知道如何使它完整。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *v[])  {
    int length;
    int num; 

    scanf("%d", &length);
    /*scanf(???)*/

    int goal=length;
    int i;

    for(i=0; i!=length; i++){
        goal=goal+i-num[i];
    };
   return goal;
}

输入和输出应该是:

输入:2 “输入” 0 2. 输出:1

输入:3 “输入” 0 3 1. 输出:2

【问题讨论】:

  • 您是否必须检查数字序列是否符合预期,即数字是否在正确的范围内,它们的计数是否正确以及您没有重复的数字? (如果不使用数组,最后一个可能是不可能的。)
  • 但可能重复的是 C# 而不是 C。

标签: c arrays numbers sequence


【解决方案1】:

0到n所有数的和是

n(a1+an)/2 = (在你的情况下 a1 = 0 and an = n+1) n*(n+1)/2

所以缺失的数字是 n*(n+1)/2 - (长度后输入数字的总和)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* v[]) {
    int length;
    int i = 0;
    int sum = 0;

    scanf_s("%d", &length);

    // calculate arithmetic series sum
    auto series_sum = ((length + 1) * (length)) / 2;

    while (i < length)
    {
        int next;
        scanf_s("%d", &next);

        sum += next;
        ++i;
    }

    printf("missing num is %d ", series_sum - sum);
}

【讨论】:

    【解决方案2】:

    您有n 要扫描的整数个数。使用数学公式计算sum of first n+1 natural numbers。然后循环运行n 次,然后运行循环以添加所有扫描到的n 数字。然后用n+1 自然数之和减去这个和。结果将是缺少的数字。

    【讨论】:

      【解决方案3】:

      问题的计算也是正确的,可以进行一些修改。

      #include <stdio.h>
      #include <stdlib.h>
      
      int main (int argc, char *v[])  {
          int length;
          int num; 
      
          // printf("enter maximum number: ");
          scanf("%d", &length);
      
          int goal=length;
          int i;
      
          for(i=0; i!=length; i++){
              // printf("number[%d]: ", i);
              if(scanf("%d", &num) != 1) { 
                  fprintf(stderr, "invalid input\n");
                  return 1;
              }
              if((num < 0) || (num > length)) {
                  fprintf(stderr, "invalid number %d\n", num);
                  return 2;
              }
      
              goal=goal+i-num;
          };
          // printf("missing number: ");
          printf("%d\n", goal);
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-07-23
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 2019-05-02
        • 1970-01-01
        • 2012-09-26
        相关资源
        最近更新 更多