首页 > 代码库 > 杭电2058
杭电2058
#include<stdio.h> int main() { int i,j,sum=0; int n,m; while(scanf("%d%d",&n,&m)&&n!=0&&m!=0) { if(n>m) break; else { for(i=1;i<=n;i++) { sum=0; for(j=i;j<=n;j++) { sum+=j; if(sum==m) {printf("[%d,%d]\n",i,j); break;} } } } } }
这种办法是一一枚举的,但是会提示时间超过,不能通过
所以应该采用枚举法,但不是一一枚举
设开始的数为i,从i开始有j个数,所以m=[(i+i+j-1)/2]*j;(因为是连续的,就相当于公差为一的等差数列的求和,即为首项加上尾项的和除以项数),
同时反解出i=(2*m/j-j+1)/2
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int main() 5 { 6 int m,n,i,j; 7 while(cin>>n>>m&&n||m) 8 { 9 for(j=(int)sqrt((double)(2*m));j>=1;j--)10 {11 i=(2*m/j-j+1)/2;12 if((2*i+j-1)*j/2==m)13 cout<<‘[‘<<i<<‘,‘<<i+j-1<<‘]‘<<endl;14 }15 16 cout<<endl;17 }18 }
超时的错误代码
杭电2058
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。