为什么这段会报错啊,各位看看!!


#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
int gy(int a, int b)
{
    if (a % b == 0)return b;
    else
    {
        return gy(b, a % b);
    }
}
int gb(int a, int b)
{
    return (a * b) / gy(a, b);
}
int min(int a,int b)
{
    return a < b ? a : b;
}
int main()
{
    int m, i, j, a[2022] = { 0 };
    for (i = 1; i <= 2021; i++)
    {
        for (j = i + 1; j <= 2021 && j <= i + 21; j++)
        {
            if (a[j] == 0)
            {
                a[j] = a[i] + gb(i, j);
            }
            else
            {
                a[j] = min(a[j], a[i] + gb(i, j));
            }
        }
    }
    printf("%d", a[2021]);
 
    return 0;
}

img


为什么这段会报错啊,各位看看!!


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

#define ARRAY_SIZE 2022
#define MAX_DELTA 21

int gcd(int a, int b)
{
    if (a % b == 0) {
        return b;
    } else {
        return gcd(b, a % b);
    }
}

int lcm(int a, int b)
{
    return (a * b) / gcd(a, b);
}

int min(int a, int b)
{
    return a < b ? a : b;
}

int main()
{
    size_t i, j;
    int a[ARRAY_SIZE] = { 0 };
    const size_t max_i = ARRAY_SIZE - MAX_DELTA - 1;

    for (i = 1; i <= max_i; i++) {
        const size_t max_j = i + MAX_DELTA;
        for (j = i + 1; j <= max_j; j++) {
            if (a[j] == 0) {
                a[j] = a[i] + lcm(i, j);
            } else {
                a[j] = min(a[j], a[i] + lcm(i, j));
            }
        }
    }

    printf("%d", a[ARRAY_SIZE - 1]);

    return 0;
}

函数名用具有描述性的名称,例如 gcd 取代 gy;
为循环变量使用 size_t 类型,因为它是无符号整型,可以避免出现一些错误;
将 a 数组的长度定义为一个常量,而不是硬编码在代码中;
将循环条件 j <= i + 21 提取为一个变量

min函数换个函数名称试试