hdu 2058
http://acm.hdu.edu.cn/showproblem.php?pid=2058
【题意】给出n 和m , 输出 从1。。。n 的n个数字中 相加为m的子区间段
【思路】这里就是一个等差序列 用公式 sn=a1*n + (n-1)*n/2 已知sn枚举长度就可以算出 a1了 式子变形算出的a1是整数就可以直接输出结果了
在这里我貌似想多了 因为算出的结果是一个double型 直接强制类型转化为int型 要是 1.999999 不就转化为了 1 而不是2了 所以这里我又分了两种情况
考虑 但是提交上去时有一个地方写错了 使得没有进入第二个分支的情况 这样也ac了
难道这些都不用考虑的吗
记录几个函数的 用法 (虽然这里没用到)
ceil(x)返回不小于x的最小整数值(然后转换为double型)。
floor(x)返回不大于x的最大整数值。
round(x)返回x的四舍五入整数值。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<math.h> 6 #include<string> 7 #include<queue> 8
// 9 int main() 10 { 11 int i,j,m,n; 12 while(scanf("%d%d",&n,&m)!=EOF) 13 { 14 if(m==0&&n==0) //没有结束条件 超时一次 15 break; 16 int t; 17 t=sqrt((double)(2*m)); //忘记强制类型转化为double ce一次
// 输出多余的测试数据wa 一次 桑心啊。。。。 18 for(i=t; i>=1; i--) 19 { 20 double temp=(double)(2*m+i-i*i)/(double)(2*i); 21 int temp1=temp; 22 if(fabs(temp-(double)temp1)<0.00001) 23 { 24 if(temp1*i*2-i+i*i==2*m) 25 printf("[%d,%d]\n",temp1,temp1+i-1); 26 } 27 } 28 printf("\n"); 29 } 30 return 0; 31 }