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

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

相关推荐
写代码写到手抽筋3 分钟前
C++多线程的性能优化
java·c++·性能优化
二进制人工智能5 分钟前
【QT5 网络编程示例】UDP 通信
c++·qt
高林雨露6 分钟前
Java 与 Kotlin 对比学习指南(二)
java·开发语言·kotlin
Maple_land7 分钟前
# C++初阶——内存管理
c++
笑口常开xpr8 分钟前
C 语 言 --- 整 形 提 升
c语言·开发语言
IT从业者张某某15 分钟前
机器学习-04-分类算法-03KNN算法案例
算法·机器学习·分类
予安灵17 分钟前
第十二届蓝桥杯省赛软件类(c&c++组)
c语言·c++·蓝桥杯
chen_song_19 分钟前
WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试
算法·音视频·webrtc·交互·媒体
liuhaoran___27 分钟前
计算机求职面试中高频出现的经典题目分类整理
python
martian66528 分钟前
Maven核心配置文件深度解析:pom.xml完全指南
java·开发语言