#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;
}
#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函数换个函数名称试试