极值问题
对上述方法的更为详细的描述:
解析:
由条件②得出:
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\n" , 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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App