用连续自然数之和来表达整数 - 华为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

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

相关推荐
上海蓝色星球几秒前
从工具到资产:CER V2.0 造价机器人如何重构企业核心竞争力
java·数据库·mysql
spencer_tseng几秒前
System2.java
java·system
MicroTech20251 分钟前
微算法科技(NASDAQ: MLGO)噪声图像的量子图像边缘提取算法:技术革新与产业赋能
科技·算法·量子计算
WangN22 分钟前
【SONIC】Isaac Lab 系统入门指南
人工智能·python·机器人·自动驾驶·仿真
222you4 分钟前
Claude Code接入DeepSeek-v4模型
java·服务器·前端
i220818 Faiz Ul6 分钟前
高校教务|教务管理|基于springboot+vue的高校教务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·高校教务系统
雪度娃娃6 分钟前
结构型设计模式——享元模式
c++·设计模式·享元模式
大模型最新论文速读7 分钟前
EvoLM:8B 模型自写评分标准,RL 后超越 GPT-4
人工智能·深度学习·算法·机器学习·自然语言处理
Ting-yu7 分钟前
SpringCloud快速入门(4)---- nacos安装与使用
java·spring·spring cloud
木子墨5167 分钟前
工程算法实战 | 从LRU到手写本地缓存:LinkedHashMap → 双向链表+哈希表 → Caffeine 原理
java·数据结构·算法·链表·缓存