zoukankan      html  css  js  c++  java
  • 杭电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]
    ",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 }

    超时的错误代码

  • 相关阅读:
    Unbuntu--安装VMware Tools
    方法引用的基本使用
    Stream流
    Stream流的常用方法
    枚举
    编程式路由导航
    向路由组件传递数据
    缓存路由组件
    嵌套路由
    基本路由
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4004084.html
Copyright © 2011-2022 走看看