请教一个小问题

aimingjie 2004-01-13 06:07:37
题目是这样的:已知 整型i,j,k的范围分别为: -6 <= i <= 6, -8 <= j <= 8,
-10 <= k <= 10, 求i*i*i + j*j*j + k*k*k = 3 的所有整数解。


除了用三重for循环遍历的方法之外,还有什么更好的方法??
...全文
62 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kentcyq 2004-01-14
  • 打赏
  • 举报
回复
有两重循环的方法!!
先记下-10..10的3次方的值,并放在list里

并标记A这个int数组,
先赋初值100,标记达不到,然后使所有a[list[i]]=i(比如a[8]=2,因为2^3=8)

最后枚举i,j,然后看3-list[i]-list[j]是不是为100(达不到)

如果为100,则说明存在k,否则不存在,那么输出a[3-list[i]-list[j]]

用Pascal写得,因为c不能开-1000..1000的数组

如果非要用c的话就自己改一改把 :)

var a:array[-1000..1000] of integer;
list:array[-10..10] of integer;

procedure init;
var i:integer;
begin
for i:=-1000 to 1000 do a[i]:=100;
for i:=-10 to 10 do begin
list[i]:=i*i*i; {计算所有的3次方}
a[list[i]]:=i; {标记所有可达的地方}
end;
end;

procedure work;
var i,j:integer;
begin
for i:=-6 to 6 do {枚举i,j}
for j:=-8 to 8 do
if (a[3-list[i]-list[j]]<>100) then writeln(i,' ',j,' ',a[3-list[i]-list[j]]);
end;

begin
init; {初始化}
work;
end.
zhangfjj 2004-01-14
  • 打赏
  • 举报
回复
如果多一个条件,可以只用二重循环,但只有一个式子,只能用穷举法来试探每一个解!
sharkhuang 2004-01-14
  • 打赏
  • 举报
回复
就是穷举发!
zhangfjj 2004-01-14
  • 打赏
  • 举报
回复
其实题目给出了其他条件----就是-10<=k<=10
zhangfjj 2004-01-14
  • 打赏
  • 举报
回复
楼上说的有道理
#include <math.h>
#include <stdio.h>

int main()
{

int i,j,k;
double tk;
for (i=-6;i<=6;i++)
for (j=-8;j<=8;j++)
{
tk=pow(3-i*i*i-j*j*j,1.0/3);
k=(int)(tk);
if(k-tk==0&&(k<=10&&k>=-10))//有个问题,怎么比较一个浮点数和整数????
printf("i=%d j=%d k=%d tk=%lf\n",i,j,k,tk);
}

getchar();
return 0;
}
jys0793 2004-01-14
  • 打赏
  • 举报
回复
可以减为两重循环,你先将i与j循环再通过表达式求出k,然后判断K的范围是不是在-10与10之间。这样循环次数由38400次减为192次。
zhaochong12 2004-01-14
  • 打赏
  • 举报
回复
cout << "4 种解"
<< endl;
<< "i=-5, j=4, k=4
i=1, j=1, k=1
..............";

楼主有点吹毛求屁的嫌疑~
aimingjie (我是菜鸟我怕谁?)
我记得你不是第一次这样了, 印象很糟糕~

这个问题我也没有更好的办法~sorry~
darkhawk 2004-01-14
  • 打赏
  • 举报
回复
完全可以用递归的方法来实现啊

PrintValue(int i, int j, int k)
{
//小于6继续,否则结束
if(i <= 6)
{
PrintValue(i++, j, k);
}

if(j <= 8)
{
PrintValue(i, j++, k);
}
...
}

可能有错误,但是你可以调调,理论上没有什么问题
aimingjie 2004-01-14
  • 打赏
  • 举报
回复
zhaochong12(笨鸟):

我不知道你为什么会对我有这样的印象,可能是因为我问的问题在你看来太简单,但是在简单的问题总会有更好的方法来解决!难道你认为没有其他的方法来解决就觉得我在“吹毛求屁”吗??
如果你要是觉得我的问题你不屑于回答,那么请你走远点,用不着在我这里指手画脚的,相信总还是有人能帮我找到更好的方法。

感谢那些真正在帮我出谋划策的DXs!!
Bandry 2004-01-13
  • 打赏
  • 举报
回复
up
我想如果不去考虑数学的只有这个笨方法了
如果考虑数学方法,你应该先把表达式换一种表达方法,等价转换为另一种计算表达式,然后再根据新的表达式确定新的程序设计方法
aimingjie 2004-01-13
  • 打赏
  • 举报
回复
foxmail(萧遥 www.LoveSnow.com):能不能说的详细点,你说的方法我也想过,但是想来想去差不多还是要从头遍历一遍。



crf5016(小三儿) :我已经说过,除了你这种方法还有没有其他更好的方法???
crf5016 2004-01-13
  • 打赏
  • 举报
回复
#include <stdio.h>

void main()
{
int i,j,k;
for (i=-6;i<=6;i++)
for (j=-8;j<=8;j++)
for (k=-10;k<=10;k++)
if((i*i*i+j*j*j+k*k*k)==3) printf("i=%d j=%d k=%d\n",i,j,k);
}
foxmail 2004-01-13
  • 打赏
  • 举报
回复
加入奇数、偶数、越界判断

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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