首页 > 解决方案 > 找到最大可能的除数

问题描述

我正在尝试用 C 编写代码,其中我声明了两个变量 A、B 和 A>=B,

给定两个整数 A 和 B,找出能被 B 整除的最大数 ≤A。在单独的一行中打印出小于或等于 A 且能被 B 整除的最大整数。

我试图解决,但由于运行时错误,该解决方案没有被接受。代码是

#include <stdio.h>

int main(void) {
    long long A, B, flag = 1;
    scanf("%lli", &A);
    printf("\n");
    scanf("%lli", &B);
    for(int i = 1; i <= A; i++)
    {
        while(B > 0)
        {
            if(i % B == 0)
                flag = i;
        }
    }
    printf("%lli\n", flag);
    return 0;
}

所以然后我用另一种方法去

#include <stdio.h>

int main() {
    long long A, B, n;
    scanf("%lli", &A);
    printf("\n");
    scanf("%lli", &B);
    if(A >= 1 && B >= 1 && A >= B)
    {
        n = A % B;
        if(A % B == 0)
            printf("%lli\n", A);
        else
            printf("%lli\n", A - n);
    }
    return 0;
}

但在这里它根本不接受显示错误答案的代码。

我不知道我在哪里出错,尽管这些程序是在 VS CODE 上运行的。

标签: c

解决方案


1.运行时错误可能是你使用了不兼容的类型:

    long long A, B, flag = 1;
    ....
    for(int i = 1; i <= A; i++)

long long类型A可能比的int类型具有更大的范围i。如果是这样,您的循环变量i可能永远不会达到A. 而且你不知道当循环到达时会发生什么i==INT_MAX。很可能i会返回一个很大的负值,它仍然小于A,并且循环将永远迭代——因此达到时间限制并且程序被中止。

如果输入值小于INT_MAX,则不会发生这种情况,显然是这种情况。(但是,约束应该在问题中给出,而不是在下面的评论中。)

2.主要问题是@pmg 在评论while(B > 0) {...}中指出的无限循环。循环体不会修改,因此循环条件一旦被验证,就会永远保持真实。B

3.自动验证问题的另一个来源可能是输出格式,正如@Zilog80 在此处指出的那样。从代码中删除不必要printf("\n");的指令。

4.顺便说一句,这里根本不需要循环。B整数除法给出截断的结果,因此不大于A(均为正)的最大倍数很简单:

    A / B * B

推荐阅读