1 条题解

  • 0
    @ 2025-9-15 23:51:43

    C

    说明

    本题要求找出不超过N的非负整数中能被K整除的最大数。核心逻辑是:能被K整除的数一定是K的倍数(即m×K,m为非负整数),因此最大的符合条件的数是“不超过N的最大K的倍数”。
    计算方法为:先用N除以K取整数商(向下取整,C语言整数除法默认此行为),再将商乘以K,结果即为所求。例如N=3、K=2时,3÷2=1(商),1×2=2,符合条件。
    由于N和K最大可达2×10⁹,需用long long类型存储以避免溢出,时间复杂度为O(1)。

    代码

    #include <stdio.h>
    
    int main() {
        long long N, K;
        // 读取N和K(用%lld处理long long类型)
        scanf("%lld %lld", &N, &K);
        
        // 计算最大的K的倍数:(N/K)取整数商,再乘以K
        long long lucky = (N / K) * K;
        
        // 输出结果
        printf("%lld\n", lucky);
        return 0;
    }
    

    C语言拓展知识

    推荐搜索:C语言中long long类型的范围(可表示至约9×10¹⁸)、整数除法的向下取整特性(对正整数的影响)、大数运算中的类型选择原则(避免溢出)。

    C++

    说明

    本题逻辑与C语言一致(找不超过N的最大K的倍数),C++通过long long类型处理大数,利用整数除法的向下取整特性计算商,再乘以K得到结果。代码中使用输入输出流,无需格式控制符,更简洁。

    新知识

    1. 大数类型处理:
      • 术语:long long
      • 解释:64位整数类型,可表示范围约-9×10¹⁸到9×10¹⁸,足以容纳题目中2×10⁹的输入及运算结果,避免溢出(如2×10⁹×2×10⁹=4×10¹⁸仍在范围内)。
      • 对比:C和C++均支持long long,但C++的输入输出(cin/cout)无需显式格式控制符(如%lld),更方便。

    AC

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        long long N, K;
        // 读取N和K(long long类型直接用cin读取)
        cin >> N >> K;
        
        // 计算最大的K的倍数
        long long lucky = (N / K) * K;
        
        // 输出结果
        cout << lucky << endl;
        return 0;
    }
    

    C++拓展知识

    推荐搜索:C++中long longint的性能对比、整数除法在不同数据类型中的行为一致性、大数运算中的溢出检测方法。

    • 1

    信息

    ID
    336
    时间
    1000ms
    内存
    64MiB
    难度
    6
    标签
    递交数
    28
    已通过
    10
    上传者