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

题目描述

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

输入描述

一个目标整数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

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

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++

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

相关练习题

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

03-16 18:36