华为OD机试(C卷+D卷)2024真题目录(Java & c++ & python)
题目描述
给定一个正整数 n,如果能够分解为 m(m > 1)个连续正整数之和,请输出所有分解中,m最小的分解。
如果给定整数无法分解为连续正整数,则输出字符串"N"。
输入描述
输入数据为一整数,范围为 (1, 2^30]
输出描述
比如输入为:
21
输出:
21=10+11
示例
输入
21
输出:
21=10+11
说明:
21可以分解的连续正整数组合的形式有多种:
21=1+2+3+4+5+621=6+7+8
21=10+11
其中 21=10+11,是最短的分解序列。
解题思路
以下是C++、Java、Python代码:
C++代码
#include <iostream>
using namespace std;
string findSmallestM(int n) {
for (int m = 2; m * (m - 1) < 2 * n; ++m) {
if ((2 * n - m * (m - 1)) % (2 * m) == 0) {
int a = (2 * n - m * (m - 1)) / (2 * m);
string result = to_string(n) + "=";
for (int i = 0; i < m; ++i) {
result += to_string(a + i);
if (i < m - 1) result += "+";
}
return result;
}
}
return "N";
}
int main() {
int n;
cin >> n;
cout << findSmallestM(n) << endl;
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static String findSmallestM(int n) {
for (int m = 2; m * (m - 1) < 2 * n; ++m) {
if ((2 * n - m * (m - 1)) % (2 * m) == 0) {
int a = (2 * n - m * (m - 1)) / (2 * m);
StringBuilder result = new StringBuilder(n + "=");
for (int i = 0; i < m; ++i) {
result.append(a + i);
if (i < m - 1) result.append("+");
}
return result.toString();
}
}
return "N";
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(findSmallestM(n));
}
}
Python代码
def find_smallest_m(n):
for m in range(2, int((2 * n)**0.5) + 1):
if (2 * n - m * (m - 1)) % (2 * m) == 0:
a = (2 * n - m * (m - 1)) // (2 * m)
result = f"{n}="
result += "+".join(str(a + i) for i in range(m))
return result
return "N"
n = int(input())
print(find_smallest_m(n))