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

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

题目描述

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

输入描述

一个目标整数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个自然数,
最后输出。每个表达式中的自然数都是按递增次序输出的。
数字与符号之间无空格

示例2

复制代码
输入:
10

输出:
10=10
10=1+2+3+4
Result:2

题解

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

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

Java

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));
    }
}

Python

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}")

C++

cpp 复制代码
#include <iostream>

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;
}

相关练习题

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

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

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

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

相关推荐
卷无止境4 小时前
C++ 的Eigen 库全解析
c++
卷无止境4 小时前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
宇宙之一粟4 小时前
乐企版式文件生成平台
java·后端·python
plainGeekDev5 小时前
MVC 写法 → MVVM
android·java·kotlin
SL_staff5 小时前
3周搭完MES系统:JVS低代码+JVS-IoT物联网的实战记录
java·前端·低代码
郝学胜_神的一滴5 小时前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
MacroZheng5 小时前
斩获20w star!Claude Code最强插件,AI编程必备!
java·人工智能·后端
kisshyshy5 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
唐青枫7 小时前
Java Spring WebFlux 实战指南:用 Mono、Flux 和 WebClient 写响应式接口
java·spring
To_OC16 小时前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode