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. 连续整数求和 | 困难 |
❤️有考友通过专栏已经快速通过机考,都是原题哦~~ 💪
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏