zoukankan      html  css  js  c++  java
  • 极值问题

    对上述方法的更为详细的描述:

    析:

    由条件②得出:

    n^2-mn-m^2+1=0

    n^2-mn-m^2-1=0

    根据求根公式:

    n1,2=(m+Δ1,2)/2

     n3,4=(m-Δ1,2)/2

    其中:

    Δ1=sqrt(5*m^2+4)

    Δ2=sqrt(5*m^2-4)

    (sqrt即为求非负实数平方根)

    下面再来考虑条件①.由于n>1,因此排除了n3和n4存在的可能性,即

    n=n1=(m+Δ1)/2   或者   n=n2=(m+Δ2)/2

    又由于n和m是整数,因此Δ1和Δ2应为整数.同样,(m+Δ1)/2 和 (m+Δ2)/2也应为整数.

    有了上述条件限制和m与n的函数关系式,使得求m^2+n^2值最大的一族m和n就比较方便了.

    由于m^2+n^2单调递增,因此我们从m=k出发,按递减方向将m值代入n的求根公式.只要Δ1(或Δ2)为整数,n1(或n2)为整数且小于k,则得出的一组m和n一定使m^2+n^2的值最大.

    代码如下:

       
    int m,n,k;
        double delt1,delt2,n1,n2;
        scanf("%d",&k);
        for(m=k;m>=1;m--)
        {
            delt1=sqrt(5*m*m+4);
            n1=(m+delt1)/2;
            n=n1;
            if(n==n1&&n<=k) break;
            delt2=sqrt(5*m*m-4);
            n2=(m+delt2)/2;
            n=n2;
            if(n==n2&&n<=k) break;
        }
        printf("%d %d
    ",m,n);

     

    标准答案是:

    1、输入k,n ← 1, m ← 1

    2、t ← n+m

    3、若 t ≤ k,则 m ← n, n ← t,转下一步

    4、若t ≤ k,则返回第2步,否则转下一步

    5、输出m、n,结束

     

    代码如下:

          

        int n=1,m=1,k,t;
        cin>>k;
        do
        {
            t=n+m;
            if(t<=k)
            {
                m=n;
                    n=t;
            }
        }
        while(t<=k);
        cout<<"m="<<m<<endl<<"n="<<n;
  • 相关阅读:
    宝塔面板连接数据库失败
    fastadmin上线部署中遇到访问路径问题
    宝塔部署时,出现“open_basedir restriction in effect”错误
    layui hint:upload is not a valid module
    thinkphp--控制器怎么分配变量到公共模板
    jquey click事件无效
    1.31 SVN代码版本控制
    8.1 性能优化简介
    5.31 Nginx最全面知识
    4.115 Spring的事务管理
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/5195337.html
Copyright © 2011-2022 走看看