如何在不使用数组的情况下找到丢失的号码?

时间:2019-09-24 08:34:24

标签: c arrays numbers sequence

我必须在数字序列中找到一个丢失的数字。 输入由介于0和35000之间的正整数n和范围为[0..n]的n个唯一数字组成。 (因此该范围包含n + 1个数字)。

我已经尝试过使用sum={n*(n+1)}/2然后尝试misNum=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“ enter” 02。输出:1

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

3 个答案:

答案 0 :(得分:3)

从0到n的所有数字之和为

  

n(a1 + an)/ 2 =(在您的情况下a1 = 0和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);
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

从问题中得出的计算结果也是正确的,可以进行一些修改。

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