序列和问题解法 C++

 

题目描述:

 

给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。
例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7

输入描述:

输入数据包括一行: 两个正整数N(1 ≤ N ≤ 1000000000),L(2 ≤ L ≤ 100)

输出描述:

从小到大输出这段连续非负整数,以空格分隔,行末无空格。如果没有这样的序列或者找出的序列长度大于100,则输出No

示例1

输入

复制

18 2

输出

复制

5 6 7

分析,这是一个等差数列,找出等差数列的第一个数就对了,n是从小到大找,找到的第一个就是最小的那个排列。

C++解法:

#include<iostream>
using namespace std;

int main(){
    int i,n,N,L;
    cin>>N>>L;
    for(n=L;n<=100;n++){
            if((2*N-n*n+n)%(2*n) == 0){
                int start=(2*N-n*n+n)/(2*n);
                for(i=0;i<n-1;i++)
                    cout<<start+i<<" ";
                cout<<start+n-1;
                return 0;
            }
        }
    cout<<"No";
}

我为什么写成:

for(i=0;i<n-1;i++)
   cout<<start+i<<" ";
cout<<start+n-1;

写成:

for(i=0;i<=n-1;i++)
    cout<<start+i<<" ";
    

不行吗?

不行,这样最后一个数就带有“ ”的空格。在它的编译器里判断为异常,下面这样提示:

猜你喜欢

转载自blog.csdn.net/sinat_39416814/article/details/105101662