1820: 连续正整数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 12 Solved: 7
[ Submit][ Status][ Web Board]
Description
【问题描述】 有些正整数可以被表示为n(n>=2)个连续正整数之和,例如: 15=1+2+3+4+5 15=4+5+6 15=7+8 编写程序,从标准输入上读入一个不大于5000的正整数,找出和为该数的所有连续正整数序列,将相应的等式输出到标准输出上,每行一个等式,且不得重复输出。等式的左侧为输入的整数,右侧表达式中的数字以从小到大的顺序排列。如果结果有多个等式,按等式右侧最小正整数的升序输出。等式内各个字符相连,每个等式以换行符结束。如果没有符合要求的等式,输出“NONE”。
Input
【输入样例1】 15
【输入样例2】 16
Output
【输出样例1】
15=1+2+3+4+5
15=4+5+6
15=7+8
【输出样例2】
NONE
HINT
不要超时!支持java /C /C++
Source
想到上面写的这道题目!数据太大就超时了!原来这一题我
用vector存的,一开始数据小过了,老师一改数据就大了!
就不好使了,发一下原来的代码:
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n,i,j,sum,l,k,f;
while(cin>>n)
{
f=0;
for(i=1;i<=n/2;i++)
{
sum=i;
vector<int>a;
a.push_back(i);
for(j=i+1;j<=n;j++)
{
sum+=j;
a.push_back(j);
if(sum>=n)
{
l=a.size();
if(sum==n)
{
f=1;
cout<<n<<"=";
for(k=0;k<l-1;k++)
{
cout<<a[k]<<"+";
}
cout<<a[l-1]<<endl;
}
break;
}
}
}
if(f==0)
{
cout<<"NONE"<<endl;
}
}
}
发一下现在的代码
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
int n,m,sum,i,j,f;
while(cin>>n)
{
m=n;
f=0;
for(i=(int)sqrt(2*m);i>=2;i--)
{
sum=m-i*(i-1)/2;
if(sum%i==0)
{
f=1;
cout<<n<<"=";
for(j=sum/i;j<sum/i+i-1;j++)
{
cout<<j<<"+";
}
cout<<sum/i+i-1<<endl;
}
}
if(f==0)
{
cout<<"NONE"<<endl;
}
}
}