51NOD 1138 连续整数的和
2017-08-25 16:46
232 查看
1138
连续整数的和
基准时间限制:1 秒 空间限制:131072 KB 分值:
10
难度:2级算法题
收藏
关注
取消关注
给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2)。例如N
= 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8。如果不能写为若干个连续整数的和,则输出No Solution。
Input
Output
Input示例
Output示例
思路:等差数列求和
N = n(a1+an)/2;
an = a1+(n-1)*d (d==1)
== 》 a1 = N / i - ( i - 1 ) / 2
又因为当 a1 == 1 时,得 i + i * ( i - 1 ) == 2 * N 这时 N分解的长度最大
因此只需要遍历 i [2,sqrt(n*2)+1/2);
Code:
连续整数的和
基准时间限制:1 秒 空间限制:131072 KB 分值:
10
难度:2级算法题
收藏
关注
取消关注
给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2)。例如N
= 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8。如果不能写为若干个连续整数的和,则输出No Solution。
Input
输入1个数N(3 <= N <= 10^9)。
Output
输出连续整数中的第1个数,如果有多个按照递增序排列,如果不能分解为若干个连续整数的和,则输出No Solution。
Input示例
15
Output示例
1 4 7
思路:等差数列求和
N = n(a1+an)/2;
an = a1+(n-1)*d (d==1)
== 》 a1 = N / i - ( i - 1 ) / 2
又因为当 a1 == 1 时,得 i + i * ( i - 1 ) == 2 * N 这时 N分解的长度最大
因此只需要遍历 i [2,sqrt(n*2)+1/2);
Code:
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin >> n ; set<int>s; for( int i = 2 ; i < sqrt(n*2+1/2) ; i++ ){ int temp = n/i-(i-1)/2; if( temp * i == n - i * (i-1) / 2 ) s.insert(temp); } if( !s.size() ) printf("No Solution\n"); else{ set<int>::iterator it; for( it = s.begin(); it != s.end() ; it++ ){ cout << *it << endl; } } return 0; }
相关文章推荐
- 51nod 1138 连续整数的和
- 51nod 1138 连续整数的和 【栈操作】
- 51nod 1138 连续整数的和
- 51nod 1138 连续整数的和(数学公式)
- 51Nod 1138 连续整数的和
- 51nod 1138 连续整数的和(等差数列)
- 51nod 1138 连续整数的和 (数学公式_转换思想,好题吧)
- 51nod 1138 连续整数的和(数学)
- 51nod 1138 连续整数的和
- 51Nod-1138-连续整数的和
- 51nod 1138 连续整数的和
- 【51Nod】1138 连续整数的和
- 51nod--1138 . 连续整数的和
- 51Nod 1138 连续整数的和
- 51nod 1138 连续整数的和(简单数学、等差数列)
- 51nod 1138 连续整数的和(数学)
- 51nod 1138 连续整数的和 (规律)
- 51Nod 1138 连续整数的和
- 51nod 1138 连续整数的和
- 【51nod】--1138 连续整数的和 (思维)