Advertisement

上海计算机学会2020年11月月赛C++丙组T4连续拆分

阅读量:

连续拆分

内存限制: 256 Mb时间限制: 1000 ms

题目描述

我们希望将一个正整数 n 拆分成若干个连续的正整数的和,例如 n=18 时:

18=3+4+5+6

就是一种拆分方法。给定一个正整数 n,请找出所有的连续整数拆分方法,注意一种合法的拆分至少需要两项连续的整数。

输入格式

单个整数:表示正整数 n。

输出格式
  • 若不存在任何拆分方案,输出 None
  • 若有多个拆分方案,不同方案用换行隔开,先输出项数多的拆分方案。
  • 每个拆分方案,应输出一个从小到大的连续正整数序列,每个数字之间用空格隔开。
数据范围
  • 对于 30% 的数据,1≤n≤100
  • 对于 60% 的数据,1≤n≤10^4。
  • 对于 100% 的数据,1≤n≤10^7。
样例数据

输入:
15

输出:
1 2 3 4 5
4 5 6
7 8
输入:
4
输出:
None

解析:

连续拆分后的首项a,末项b,则(a+b)(b-a+1)==n,整理一下得到 bb+b=2n+aa-a,可以通过枚举a,计算b,然后打印结果,详见代码:

提示1:数据类型要用long long ,i*i可能会超int。

提示2:若b*b+b==x,则b=sqrt(x)。只是需要反向验证一下。

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 long long n;
    
 bool flag=1;
    
 int main() {
    
     cin>>n;
    
     for(long long i=1;i<=n/2;i++){
    
     long long x=n*2+i*i-i;
    
     long long b=sqrt(x);
    
     if (b*b+b==x){
    
         for(int j=i;j<=b;j++){
    
             cout<<j<<" ";
    
         }
    
         cout<<endl;
    
         flag=0;
    
     }
    
     }
    
     if (flag==1){
    
     cout<<"None";
    
     }
    
     return 0;
    
 }
    
    
    
    
    AI写代码cpp
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-31/vQgUdoFH1xZGumVBjAYfs5WIr46S.png)

全部评论 (0)

还没有任何评论哟~