【问题标题】:Longest sequence of the same number&how many longest seqeuences exist (without array)相同数的最长序列&存在多少个最长序列(无数组)
【发布时间】:2018-03-20 16:26:38
【问题描述】:

在 C 语言中,我只能使用 stdio.h,而不能使用数组。

问题是:我需要写函数“void MaxLegnth()” 输入整数,只要它们是正数,如果输入负数,输入部分将停止。 我需要找到最长的相同数字序列,以及它发生了多少次。例如:

输入:

19 19 97 97 97 97 681 681 681 681 97 36 36 36 97 97 97 97 36 -19     

输出:

maximum length - 4  
occurred - 3  

我一直在努力解决这个问题并想出了这个问题,但我不知道如何解决它:

void MaxLength()
{
    int num1, temp, currentmax = 0, countmax = 0, globalmax = 0;
    printf("Please enter positive integers: ");
    scanf_s("%d", &num1);
    temp = num1;
    if (num1 > 0)
        currentmax++;
    while (num1 > 0)
    {
        scanf_s("%d", &num1);
        if (num1 < 0)
        {
            //currentmax--;
            break;
        }
        if (num1 == temp)
        {
            currentmax++;
            temp = num1;
            if (currentmax > globalmax)
                globalmax = currentmax;
        }
        else
        {
            if (currentmax > globalmax)
            {
                globalmax = currentmax;
                countmax = 1;
                currentmax = 1;
                temp = num1;
            }
            if (currentmax < globalmax)
            {
                currentmax = 1;
                temp = num1;
            }
            if (currentmax == globalmax)
                countmax++;
        }

    }
    printf("\ncurrent %d\n", currentmax);
    printf("\nglobal %d\n", globalmax);
    printf("\ncount %d\n", countmax);
}

对不起,巨大的文字墙。任何帮助将不胜感激!

【问题讨论】:

  • 根据您的输入,正确答案是“最大长度 - 4 次出现 - 3”还是“最大长度 - 4 次出现 - 2”?这是我害怕的“相同数字”部分。您是否必须检测出 3 个最长的序列中,其中 2 个是相同的数字?
  • 出现的部分只指最长序列出现的次数,所以无论序列是 2 2 2 2 还是 4 4 4 4 都是最长的,都会被计算在内,我希望这能解决你的问题
  • 为什么在你的例子中occured - 3
  • @IlyaBursov 97 出现 4 次,然后 681 出现 4 次,然后 97 又出现 4 次。这是连续出现 4 次。
  • 我认为我没有正确解释自己。它是“发生 - 3”,因为最长的序列(4 个连续相同的数字)出现了 3 次,所以虽然 97 97 97 97 和 681 681 681 不一样,但它们都是最长的序列,都会被计算在内,抱歉对自己的措辞不好

标签: c algorithm loops do-while


【解决方案1】:

这是你的函数的固定版本,带有一些 cmets:

int num = 0, curr = -1, currCnt = 0, maxCnt = 0, maxCntCnt = 0;
printf("Please enter positive integers: ");
while (num >= 0) {
    if (scanf("%d", &num) != 1) 
        break;
    if (num <= 0)
        break;
    if (num == curr) {
        currCnt++; // new number is continuation of sequence, increase counter
        if (currCnt == maxCnt) {
            maxCntCnt++; // we're reached previously detected max, increase counter
        }
        if (currCnt > maxCnt) {
            maxCnt = currCnt; // we're reached new max, reset counter
            maxCntCnt = 1;
        }
    } else {
        curr = num; // start of new sequence detected, reset counter
        currCnt = 1;
    }
}

printf("\nmaximum length - %d\n", maxCnt);
printf("occured - %d\n", maxCntCnt);

【讨论】:

  • @Ultraviolence 这个函数不安全。
  • @VladfromMoscow 到底什么是不安全的?
  • @IlyaBursov 首先,0 不是正数。其次,当用户按下 Ctrl+Z 或 Ctrl+d 时,代码无效。
【解决方案2】:

我们初学者应该互相帮助。:)

首先要考虑到函数应该被声明(当声明也是函数定义时)

void MaxLength( void )
                ^^^^^
{
    //...
}

你的函数太复杂了。

这是我可以建议的解决方案。

#include <stdio.h>

void MaxLength( void )
{
    size_t max_length = 0, max_count = 0;
    int prev_number = 0;

    size_t n = 0;
    _Bool valid_input;

    printf( "Please enter positive integers: " );

    do
    {
        int number = 0;

        valid_input = scanf( "%d", &number ) == 1 && number > 0;

        if ( !valid_input || number != prev_number )
        {
            if ( max_length < n )
            {
                max_length = n;
                max_count  = 1;
            }
            else if ( valid_input && max_length == n )
            {
                max_count++;
            }

            prev_number = number;
            n = 1;
        }
        else
        {
            ++n;
        }

    } while ( valid_input );

    printf( "\nmaximum length - %zu\n", max_length );
    printf( "occured - %zu\n", max_count ); 
}

int main(void) 
{
    MaxLength();

    return 0;
}

程序输出是

Please enter positive integers: 19 19 97 97 97 97 681 681 681 681 97 36 36 36 97 97 97 97 36 -19

maximum length - 4
occured - 3

【讨论】:

  • 非常感谢您花时间编写所有这些内容,尽管出于某种原因它给了我一个运行时错误,但它说我们使用了未初始化的东西。
  • 那是“prev_number”。初始化一些负面的东西应该可以解决问题。
  • @Ultraviolence 将 prev_number 初始化为 0。请参阅我更新的帖子。
  • @Tom's 或者可以初始化为0。
  • 是的,到最后也没关系。
【解决方案3】:

既然大家都给出了答案,那就是我的:

void MaxLength(void)
{
    int inputNumber;
    int previousNumber = -1;
    int currentLen     = 0;
    int maxLen         = 0;
    int nbMaxLen       = 0; 

    printf("Please enter positive integers: ");
    while (scanf("%d", &inputNumber) == 1 && inputNumber > 0) {
        ++currentLen;
        if (inputNumber != previousNumber) {
            if (currentLen == maxLen) {
                ++nbMaxLen;
            } else if (currentLen > maxLen) {
                maxLen = currentLen;
                nbMaxLen = 1;
            }
            currentLen = 1;
        }
        previousNumber = inputNumber;
    }

    if (currentLen == maxLen) {
        ++nbMaxLen;
    } else if (currentLen > maxLen) {
        maxLen = currentLen;
        nbMaxLen = 1;
    }

    printf("maxLen   = %d\n", maxLen);
    printf("nbMaxLen = %d\n", nbMaxLen);
}

您的问题来自 while 循环中的小错误,例如如果 currentmax == globalmax,则 temp1 不会采用 num1 值,我认为这不是应该做的。

在全球范围内,我们都有相同的算法,但如果您发现可疑之处,请随时提出问题。

【讨论】:

  • 非常感谢您的帮助,欢迎提供更多想法!
  • @Ultraviolence 这个帖子里的函数是错误的。:)
  • 输入什么?我用您的示例和其他示例对其进行了测试,它似乎工作正常(即使没有给出输入)。
  • @Tom 的代码无效。当用户按下 Ctrl + Z 或 Crel + d 时,它不会处理这种情况。在这种情况下,将不计算最后一个序列。
  • ???你能停止拖钓吗?要么我真的错过了一些东西,要么看到一个 134k 的代表说这样的话很尴尬。首先,您的函数不管理 ctrl z / ctrl d。其次,您的功能被窃听。如果我直接给出“-4”,则表示最大 len 为 0,并且已经发生了 1 次。不存在的事情怎么可能发生过一次???最后,在进行 scanf 时管理 ctrl z / ctrl d 需要的步骤比您想象的要多:它将依赖于操作系统,而且毫无意义。用户必须按“输入”才能输入数字。 ctrl d 不是“输入”...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2011-08-10
  • 1970-01-01
  • 2016-04-11
  • 2018-05-19
  • 2014-01-07
  • 1970-01-01
相关资源
最近更新 更多