• 用连续自然数之和来表达整数 - 华为OD统一考试(C卷)


    OD统一考试(C卷)

    分值: 100分

    题解: Java / Python / C++

    alt

    题目描述

    一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。

    输入描述

    一个目标整数T (1 <=T<= 1000)

    输出描述

    该整数的所有表达式和表达式的个数。如果有多种表达式,输出要求为:

    1.自然数个数最少的表达式优先输出

    2.每个表达式中按自然数递增的顺序输出,具体的格式参见样例。在每个测试数据结束时,输出一行”Result:X”,其中X是最终的表达式个数。

    示例1

    输入:
    9
    
    输出:
    9=9
    9=4+5
    9=2+3+4
    Result:3
    
    说明:
    整数 9 有三种表示方法,第1个表达式只有1个自然数,最先输出,第2个表达式有2个自然数,第2次序输出,第3个表达式有3个自然数,
    最后输出。每个表达式中的自然数都是按递增次序输出的。
    数字与符号之间无空格
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    示例2

    输入:
    10
    
    输出:
    10=10
    10=1+2+3+4
    Result:2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    题解

    题目类型:这道题目属于数学问题,要求计算给定整数的连续自然数之和的表达式,并按照一定规则输出结果。

    解题思路:通过两层循环遍历所有可能的连续自然数个数和起始值,计算其和并判断是否等于目标整数,如果等于则输出对应的表达式

    Java

    import java.util.Scanner;
    /**
     * @author code5bug
     */
    class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int t = in.nextInt();
    
            int result = 0;
            for (int n = 1; n <= t; n++) { // 连续的自然数个数
                for (int s = 1; s <= t; s++) { // s 自然数的起始值 , 尝试探索使得 sum(s , s + 1, ... s + n - 1) == t
                    int sum = (s + s + n - 1) * n / 2;
                    if (sum < t) continue;
                    else if (sum == t) {
                        StringBuilder builder = new StringBuilder();
                        builder.append(t).append("=");
                        for (int i = 0; i < n; i++) {
                            builder.append(s + i);
                            if (i + 1 < n) builder.append("+");
                        }
                        System.out.println(builder.toString());
                        result++;
                    } else { // 找不到可能的解
                        break;
                    }
                }
            }
            System.out.println(String.format("Result:%d", result));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    Python

    t = int(input())
    
    result = 0
    for n in range(1, t + 1): # 连续的自然数个数
        for s in range(1, t + 1): # s 自然数的起始值 , 尝试探索使得 sum(s , s + 1, ... s + n - 1) == t
            sum_val = (s + s + n - 1) * n // 2
            if sum_val < t:
                continue
            elif sum_val == t:
                builder = [str(t) + "="]
                for i in range(n):
                    builder.append(str(s + i))
                    if i + 1 < n:
                        builder.append("+")
                print("".join(builder))
                result += 1
            else:
                break
    
    print(f"Result: {result}")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    C++

    #include 
    
    using namespace std;
    
    int main()
    {
        int t;
        cin >> t;
    
        int result = 0;
        for (int n = 1; n <= t; n++) {   //  连续的自然数个数
            for (int s = 1; s <= t; s++) {   //  s 自然数的起始值 , 尝试探索使得 sum(s , s + 1, ... s + n - 1) == t
                int sum = (s + s + n - 1) * n / 2;
                if (sum < t)
                    continue;
                else if (sum == t) { // 找到满足条件的连续自然数
                    cout << t << "=";
                    for (int i = 0; i < n; i++) {
                        cout << s + i;
                        if (i + 1 < n)
                            cout << "+";
                        else
                            cout << endl;
                    }
                    result++;
                } else {
                    break;
                }
            }
        }
        cout << "Result: " << result << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    相关练习题

    题号题目难易
    LeetCode 56829. 连续整数求和困难

    ‍❤️‍有考友通过专栏已经快速通过机考,都是原题哦~~ 💪

    📝 订阅 http://t.csdnimg.cn/lifXk

    🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

  • 相关阅读:
    万宾科技内涝积水监测仪效果,预警城市积水
    【LeetCode】省份数量(并查集)
    [附源码]java毕业设计毕业论文管理系统
    各类防护电路汇总
    c#仿热血江湖
    数组矩阵交换
    强迫症SuppressWarnings各场景的使用
    Linux学习——文件IO
    stm32管脚重映射
    (1)bark-ml
  • 原文地址:https://blog.csdn.net/user_longling/article/details/136736323