蓝桥杯-连续正整数的和

问题描述
78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。
输入一个正整数 n(< =10000)
输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+1)+…+b=n。
对于多种表示法,a小的方案先输出。

样例输入
78

样例输出
1 12
18 21
25 27

解题思路:这里要用到前缀和,把从0到n的前缀和都用数组储存起来,再用两个索引i,j判断l[j]-l[i]是否等于n。如果相等,则输出i+1(因为相减的时候把l[i]减掉了,所以相减之后是从i+1到j的和)和j
代码:

#include<iostream>
using namespace std;
 
int n,l[10005];//n为输入的数,数组l用来储存前i项和
 
int main()
{
    cin>>n;
    l[0]=0;
    for(int i=1;i<=n;i++)
        l[i]=l[i-1]+i;//储存前缀和
    for(int i=0;i<=n-2;i++)//注意要从0开始判断
        for(int j=i+1;j<=n;j++){
            if(l[j]-l[i]==n)
                printf("%d %d\n",i+1,j);//输出i+1和j
            else if(l[j]-l[i]>n)//如果差值大于n的话直接结束内层循环即可
                break;
        }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42891420/article/details/87076408
今日推荐