求函数f(a,b)=2*a*a+b*b的100个最小函数值

_Wanghui_ 2005-05-19 10:18:01
设计程序按从大到小的次序依次输出函数f(a,b)=2*a*a+b*b的最小的100个函数值及相应的两个参数的值,其中a和b均为自然数(包括0)。

最好先由小到大排列出,然后入栈,出栈

本以为很简单,想了想还真没好办法,要求时间复杂度尽可能底

请高手把算法说清楚点
...全文
410 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Wanghui_ 2005-05-24
  • 打赏
  • 举报
回复
Roger给了两次10分,看错了
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
我加到100分了!
继续求助
andyli0418 2005-05-20
  • 打赏
  • 举报
回复
有难度~~ 学习 !  顶!!
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
明天再详看,晚上宿舍熄灯
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
我去吃个饭,回来再关注
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
楼上所言极是

这道题并不简单
c_nestor 2005-05-20
  • 打赏
  • 举报
回复
不用看就知道楼上不行
大家要搞清楚
不是只要考虑a++或者b++的情况的;
比如f( a, b ) = 75,// a = 5, b = 5;
这时候要考虑a = 0, f( a, b ) = 25;
还要考虑以前递增的时候中的较大者
因为以前的较大者现在可能又是较小者
感觉是一个麻烦的数学题
Rodge 2005-05-20
  • 打赏
  • 举报
回复
不好意思,还是不对
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
前10个函数值
0,1,2,3,4,6,8,9,11,12
楼上的好像不行:(
Rodge 2005-05-20
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int fun(int a,int b)
{
return 2*a*a+b*b;
}

void min(int a,int b,int n)
{
if(n >= 100)
return;

cout << "a is \t" << a << "\t b is \t" << b <<"\t fuc is \t"<<fun(a,b) << endl;

if(fun(a-1,b+1) < fun(a+1,b))
{
min(a-1,b+1,n+1);
}
else if(fun(a,b+1) < fun(a+1,b))
min(a,b+1,n+1);
else
min(a+1,b,n+1);
}

void main()
{
min(0,0,0);
}

不知道能不能满足楼主
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
继续顶,求最佳算法
mengzulin 2005-05-20
  • 打赏
  • 举报
回复
Sorry 看成f(a,b)=2*a*a*b*b
mengzulin 2005-05-20
  • 打赏
  • 举报
回复
1楼和2楼都对
假设:
a=a-1
b=a+1
则:
f(a,b)=2*a*a+b*b = 2(a-1)*(a-1)(a+1)*(a+1)
只要证明:
a*a*a*a<(a-1)*(a-1)(a+1)*(a+1) a>0

证明:
(a-1)*(a-1)(a+1)*(a+1)
=(a*a-2a+2)(a*a+2a+2)
= a*a*a*a +2a*a*a+2a*a - 2a*a*a-2a*a-4a+2a*a+4a+4
= a*a*a*a +2a*a+4

a*a*a*a<(a*a*a*a +2a*a+4)


healer_kx 2005-05-20
  • 打赏
  • 举报
回复
+之前是增函数
+只后也是

但是前面的递增速度快。
z =2a^2 + b^2是个啥图形啊?
截面是椭圆的抛物面。。。
??大一的课忘得差不多了。。。

z值最小就是ab处于第一卦限内。。。
后面不会 了。。。。
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
顶一下
_Wanghui_ 2005-05-20
  • 打赏
  • 举报
回复
楼上的各位,你们有没有考虑a=0,b=1,2,3,4,……的情况

还有b=0,a=1,2,3,……

ma100()给的程序前五个数据是0,1,3,6,12,17

但还应该是
0=2*0*0+0*0
1=2*0*0+1*1
2=2*1*1+0*0
3=2*1*1+1*1
4=2*0*0+2*2
6=2*1*1+2*2
……
martmy 2005-05-20
  • 打赏
  • 举报
回复
不好意思,有点考虑不周,
const double sqr2 = sqrt(2);
int a = 0, b = 0;
int i = 100;
int str[100];

while(i>-1)
{
str[i] = 2*a*a+b*b;
if(b+1 > sqr2*(a+1)) // 这里应该前向判定一下
a++,b--;
else
b++;
i--;
}
martmy 2005-05-20
  • 打赏
  • 举报
回复
直接搞定

const double sqr2 = sqrt(2);
int a = 0, b = 0;
int i = 100;
int str[100];

while(i>-1)
{
str[i] = 2*a*a+b*b;
if(b > sqr2*a)
a++;
else
b++;
i--;
}

寻开心 2005-05-20
  • 打赏
  • 举报
回复
这种更直接

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "conio.h"

#define MIN_N 138
main()
{
int min = 0; // 2*a*a+b*b 的数值
for (int k=1 ;k<=MIN_N; )
{
for ( int b=0; b<=sqrt(min); b++ ) // 直接用可能的b来循环
{
int temp = min - b * b;
if ( temp & 1 ) continue; // 2*a*a不可能是奇数
temp >>= 1; // a*a
int a = sqrt( temp);
if ( a * a == temp ) {
printf("%03d : a=%d, b=%d, v=%d\n", k, a, b, min);
k++;
};
}
min ++;
}
_getch();
};
fire314159 2005-05-20
  • 打赏
  • 举报
回复




从函数值入手,从1开始递增。然后用回溯法尝试能否找到合适的整数x,y。如果确定单是2*a*a都已经超过假设的值了,还没匹配,则该假设的值肯定不是我们要找的值,函数值加1,重新考察是否能找到匹配的x,y.设计数器count,每找到一个值,就加1,直到count==100,退出。
加载更多回复(18)

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧