主题:哪位朋友 帮忙看看 这题,小妹 感激不尽 了 !
sdwm2137
[专家分:0] 发布于 2007-05-19 13:48:00
这是个数据结构的课程设计题,希望能教我大概的思路及所要用到的方法,谢谢朋友!!!:
设计程序设计安从大到小的次序依次输出函数f(a,b)=2*a2(平方)+b2(平方)的最小的100个函数值及相应的两个参数值,其中a和b均为自然数。
注:用C++语言编程
最后更新于:2007-06-28 18:14:00
回复列表 (共16个回复)
板凳
zhouzhouboa [专家分:150] 发布于 2007-05-20 21:40:00
作业要自己做
3 楼
sdwm2137 [专家分:0] 发布于 2007-05-21 17:12:00
不是说 学问 学问不懂就要问吗 我自己一点头绪都没有所以只是 希望大家给点思路~~~
4 楼
argentmoon [专家分:13260] 发布于 2007-05-21 21:28:00
找出这些数存好,然后排序输出
5 楼
w_b_d [专家分:50] 发布于 2007-05-21 22:02:00
//小弟想了一个方法,不知道正确否 请大家指出错误 表达能力有限不知道说清楚没有
//如果a取x(位整数)相当于y取2(1/2次方)*x 由排列组合的知识 则a有x+1种取法(取0--x) b有2(1/2次方)*x+1
//两者的乘积〉=100 取最小的x=8 2(1/2次方)*x=11(全取整数)此时 2*a2(平方)+b2(平方)=249
//所以前100个函数值肯定不会超过249 由于a,b可以去0,因此b在a=0时不超过(249开根号后)15 a在b=0时不超过11
//所以在a为[0--11] b 为[1--15] 中取值
#include<iostream>
using namespace std;
const int max=249,bmax=15,amax=11;
const int nxiang=100;
struct xiang
{
int data;
int a,b;
};
void abc(int aa[],int bb[],xiang* & cc)
{
for(int i=0;i<max;i++)
cc[i].data=0;//
int k=0;
for(i=0;i<=amax;i++)
{
bb[i]=i*i;
aa[i]=2*i*i;
cc[bb[i]].data=1;
cc[bb[i]].a=cc[bb[i]].b=i;
cc[aa[i]].data=1;
cc[aa[i]].a=cc[aa[i]].b=i;
k++;
}
for(i=amax+1;i<=bmax;i++)
{
bb[i]=i*i;
cc[bb[i]].data=1;
cc[bb[i]].a=cc[bb[i]].b=i;
k++;
}
}
void jiSuan(int aa[],int bb[],xiang* &cc)
{
int k,i,j;
for(i=0;i<=amax;i++)
for(j=0;j<=bmax;j++)
{
k=aa[i]+bb[j];
if(k>max)
break;
else
{cc[k].data=1;cc[k].a=i;cc[k].b=j;}
}
}
void jieguo(xiang* cc,xiang* &result)
{
int n=nxiang;
for(int i=0;i<=max;i++)
{
if(cc[i].data==1)
{result[--n].data=i;result[n].a=cc[i].a;result[n].b=cc[i].b;}
if(n==0)
break;
}
}
void shuchu(xiang* result)
{
int k=1;
for(int i=0;i<nxiang;i++)
{
cout<<"a="<<result[i].a<<" b="<<result[i].b<<"值为:"<<result[i].data<<" ";
if(k++%5==0) cout<<endl;
}
}
int main()
{
int aa[amax+1],bb[bmax+1];
xiang *result=new xiang[nxiang],*cc=new xiang[max];
abc(aa,bb,cc);
jiSuan(aa,bb,cc);
jieguo(cc,result);
shuchu(result);
getchar();
//delete result;
//delete cc;
return 0;
}
6 楼
songwq [专家分:1200] 发布于 2007-05-25 13:46:00
#include <iostream.h>
int count = 1;
int sum = 0;
int fx(int a,int b)
{
return 2*a*a + b*b;
}
void f(int temp,int a,int b)
{
cout<<"a = " + a +",b = " + b + ",f(a,b) = " + fx(a,b)<<endl;
if (temp== 100)
return;
if (fx(a,b+1)>fx(a+1,b-1))
{
f(++temp,++a,--b);
}
else
f(++temp,a,++b);
}
void main()
{
f(count, 0, 0);
}
没测试。。。
7 楼
songwq [专家分:1200] 发布于 2007-05-25 14:23:00
public class My{
int count = 1;
int sum = 0;
int fx(int a,int b)
{
return 2*a*a + b*b;
}
void f(int temp,int a,int b)
{
System.out.println("a = " + a +",b = " + b + ",f(a,b) = " + fx(a,b));
if (temp== 100)
return;
if (fx(a,b+1)>fx(a+1,b-1))
{
f(++temp,++a,--b);
}
else
f(++temp,a,++b);
}
public static void main(String[] args)
{
My m = new My();
m.f(m.count, 0, 0);
}
}
8 楼
w_b_d [专家分:50] 发布于 2007-05-25 21:35:00
6,7楼的结果好像不对呢
9 楼
songwq [专家分:1200] 发布于 2007-05-25 22:29:00
是不对,谢谢楼上的,我改下
10 楼
songwq [专家分:1200] 发布于 2007-05-27 00:30:00
没想出来好的方法
public class My {
int count = 0;
int fx(int a,int b)
{
return 2 * a * a + b * b;
}
void f()
{
for( int i = 0; i < 243; i++ )
{
for (int j = 0; fx(j,0) <= i ;j++)
{
for (int k = 0; fx(j,k) <= i ;k++)
{
if (fx(j,k) == i)
{
System.out.println("a = " + j + ", b = " + k + ", f(a,b) = " + fx(j,k) + ", count = " + count );
count++;
if (count == 100)
return;
}
}
}
}
}
public static void main(String[] args)
{
My m = new My();
m.f();
}
}
我来回复