在不使用 C 中的数组的情况下查找最长的数字序列

Finding longest sequence of digits without using arrays in C

我正在学习 C 编程课程,我的任务之一是编写一个程序,从标准输入读取一个整数,然后打印到标准输入 输出,出现在最长连续序列中的数字。如果有多个连续的最长序列,则打印最小的数字。 1 警告是我们不允许使用数组来解决这个问题。

例子input/output:输入1122/输出1,输入800100022/输出0.

我创建了一个函数来遍历输入数字,确定最长的序列和 return 相应的数字,但我不确定为什么这个算法在某些情况下不起作用。我需要一些帮助来识别我的代码中的一些逻辑缺陷。非常感谢

long get_digit(long n) {
    long prev_digit = 0;
    long freq = 0;
    long max_freq;
    long most_freq_digit = 0;
    //flag to symbolise first iteration
    long flag = 0;
    while (n > 0) {
        if (flag == 0) {
            freq += 1;
            most_freq_digit = n % 10;
        } else {
            if (n % 10 == prev_digit) {
                freq += 1;
            }
            if (n % 10 != prev_digit || n < 10) {
                if (freq > max_freq) {
                    max_freq = freq;
                    most_freq_digit = prev_digit;
                } else
                if (freq == max_freq) {
                    if (prev_digit <= most_freq_digit) {
                        most_freq_digit = prev_digit;
                    }
                }
                freq = 1;
            }
        }
        flag += 1;
        prev_digit = n % 10;
        n = n / 10;
    }
    return most_freq_digit;
}

我猜这是你的简短答案 这两个函数给你最小的数字和最大的

主要算法是这样的

  1. 得到 mod 的数字乘以 10 并存储在 temp
  2. 将数字除以 10
  3. 获取新的 mod 并与温度比较,如果较小则交换它们
  4. 继续直到数字为 0
int getSmallestDigit(int num) {
    int smallest;
    int temp;

    smallest = num % 10;
    num /= 10;

    while (num > 0) {
        temp = num % 10;
        if (temp < smallest) {
            smallest = temp;
        }
        num /= 10;
    }
    return smallest;
}

int getLargestDigit(int num) {
    int large;
    int temp;

    large = num % 10;
    num /= 10;

    while (num > 0) {
        temp = num % 10;
        if (temp > large) {
            large = temp;
        }
        num /= 10;
    }
    return large;
}

您的代码中存在多个问题:

  • 您没有初始化 max_freq,因此整个函数具有未定义的行为。
  • flag(n % 10 != prev_digit || n < 10) 更新 max_freqmost_freq_digit 的测试很麻烦:您可以通过处理循环外的第一个数字来简化逻辑。
  • 你不处理负数。

这是一个更简单的版本:

long get_digit(long n) {
    long div = n < 0 ? -10 : 10;
    long freq = 1;
    long digit = n % div;
    long max_freq = freq;
    long most_freq_digit = digit;
    while (n != 0) {
        if (n % div == digit) {
            freq += 1;
        } else {
            digit = n % div;
            freq = 1;
        }
        if (freq > max_freq || (freq == max_freq && digit < most_freq_digit)) {
            max_freq = freq;
            most_freq_digit = digit;
        }
        n = n / 10;
    }
    return most_freq_digit;
}