-10 <= k <= 10, 求i*i*i + j*j*j + k*k*k = 3 的所有整数解。
除了用三重for循环遍历的方法之外,还有什么更好的方法??
13 个解决方案
#1
加入奇数、偶数、越界判断
#2
#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);
}
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);
}
#3
foxmail(萧遥 www.LoveSnow.com):能不能说的详细点,你说的方法我也想过,但是想来想去差不多还是要从头遍历一遍。
crf5016(小三儿) :我已经说过,除了你这种方法还有没有其他更好的方法???
crf5016(小三儿) :我已经说过,除了你这种方法还有没有其他更好的方法???
#4
up
我想如果不去考虑数学的只有这个笨方法了
如果考虑数学方法,你应该先把表达式换一种表达方法,等价转换为另一种计算表达式,然后再根据新的表达式确定新的程序设计方法
我想如果不去考虑数学的只有这个笨方法了
如果考虑数学方法,你应该先把表达式换一种表达方法,等价转换为另一种计算表达式,然后再根据新的表达式确定新的程序设计方法
#5
cout << "4 种解"
<< endl;
<< "i=-5, j=4, k=4
i=1, j=1, k=1
..............";
楼主有点吹毛求屁的嫌疑~
aimingjie (我是菜鸟我怕谁?)
我记得你不是第一次这样了, 印象很糟糕~
这个问题我也没有更好的办法~sorry~
<< endl;
<< "i=-5, j=4, k=4
i=1, j=1, k=1
..............";
楼主有点吹毛求屁的嫌疑~
aimingjie (我是菜鸟我怕谁?)
我记得你不是第一次这样了, 印象很糟糕~
这个问题我也没有更好的办法~sorry~
#6
就是穷举发!
#7
如果多一个条件,可以只用二重循环,但只有一个式子,只能用穷举法来试探每一个解!
#8
有两重循环的方法!!
先记下-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.
先记下-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.
#9
zhaochong12(笨鸟):
我不知道你为什么会对我有这样的印象,可能是因为我问的问题在你看来太简单,但是在简单的问题总会有更好的方法来解决!难道你认为没有其他的方法来解决就觉得我在“吹毛求屁”吗??
如果你要是觉得我的问题你不屑于回答,那么请你走远点,用不着在我这里指手画脚的,相信总还是有人能帮我找到更好的方法。
感谢那些真正在帮我出谋划策的DXs!!
我不知道你为什么会对我有这样的印象,可能是因为我问的问题在你看来太简单,但是在简单的问题总会有更好的方法来解决!难道你认为没有其他的方法来解决就觉得我在“吹毛求屁”吗??
如果你要是觉得我的问题你不屑于回答,那么请你走远点,用不着在我这里指手画脚的,相信总还是有人能帮我找到更好的方法。
感谢那些真正在帮我出谋划策的DXs!!
#10
完全可以用递归的方法来实现啊
PrintValue(int i, int j, int k)
{
//小于6继续,否则结束
if(i <= 6)
{
PrintValue(i++, j, k);
}
if(j <= 8)
{
PrintValue(i, j++, k);
}
...
}
可能有错误,但是你可以调调,理论上没有什么问题
PrintValue(int i, int j, int k)
{
//小于6继续,否则结束
if(i <= 6)
{
PrintValue(i++, j, k);
}
if(j <= 8)
{
PrintValue(i, j++, k);
}
...
}
可能有错误,但是你可以调调,理论上没有什么问题
#11
可以减为两重循环,你先将i与j循环再通过表达式求出k,然后判断K的范围是不是在-10与10之间。这样循环次数由38400次减为192次。
#12
楼上说的有道理
#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;
}
#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;
}
#13
其实题目给出了其他条件----就是-10<=k<=10
#1
加入奇数、偶数、越界判断
#2
#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);
}
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);
}
#3
foxmail(萧遥 www.LoveSnow.com):能不能说的详细点,你说的方法我也想过,但是想来想去差不多还是要从头遍历一遍。
crf5016(小三儿) :我已经说过,除了你这种方法还有没有其他更好的方法???
crf5016(小三儿) :我已经说过,除了你这种方法还有没有其他更好的方法???
#4
up
我想如果不去考虑数学的只有这个笨方法了
如果考虑数学方法,你应该先把表达式换一种表达方法,等价转换为另一种计算表达式,然后再根据新的表达式确定新的程序设计方法
我想如果不去考虑数学的只有这个笨方法了
如果考虑数学方法,你应该先把表达式换一种表达方法,等价转换为另一种计算表达式,然后再根据新的表达式确定新的程序设计方法
#5
cout << "4 种解"
<< endl;
<< "i=-5, j=4, k=4
i=1, j=1, k=1
..............";
楼主有点吹毛求屁的嫌疑~
aimingjie (我是菜鸟我怕谁?)
我记得你不是第一次这样了, 印象很糟糕~
这个问题我也没有更好的办法~sorry~
<< endl;
<< "i=-5, j=4, k=4
i=1, j=1, k=1
..............";
楼主有点吹毛求屁的嫌疑~
aimingjie (我是菜鸟我怕谁?)
我记得你不是第一次这样了, 印象很糟糕~
这个问题我也没有更好的办法~sorry~
#6
就是穷举发!
#7
如果多一个条件,可以只用二重循环,但只有一个式子,只能用穷举法来试探每一个解!
#8
有两重循环的方法!!
先记下-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.
先记下-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.
#9
zhaochong12(笨鸟):
我不知道你为什么会对我有这样的印象,可能是因为我问的问题在你看来太简单,但是在简单的问题总会有更好的方法来解决!难道你认为没有其他的方法来解决就觉得我在“吹毛求屁”吗??
如果你要是觉得我的问题你不屑于回答,那么请你走远点,用不着在我这里指手画脚的,相信总还是有人能帮我找到更好的方法。
感谢那些真正在帮我出谋划策的DXs!!
我不知道你为什么会对我有这样的印象,可能是因为我问的问题在你看来太简单,但是在简单的问题总会有更好的方法来解决!难道你认为没有其他的方法来解决就觉得我在“吹毛求屁”吗??
如果你要是觉得我的问题你不屑于回答,那么请你走远点,用不着在我这里指手画脚的,相信总还是有人能帮我找到更好的方法。
感谢那些真正在帮我出谋划策的DXs!!
#10
完全可以用递归的方法来实现啊
PrintValue(int i, int j, int k)
{
//小于6继续,否则结束
if(i <= 6)
{
PrintValue(i++, j, k);
}
if(j <= 8)
{
PrintValue(i, j++, k);
}
...
}
可能有错误,但是你可以调调,理论上没有什么问题
PrintValue(int i, int j, int k)
{
//小于6继续,否则结束
if(i <= 6)
{
PrintValue(i++, j, k);
}
if(j <= 8)
{
PrintValue(i, j++, k);
}
...
}
可能有错误,但是你可以调调,理论上没有什么问题
#11
可以减为两重循环,你先将i与j循环再通过表达式求出k,然后判断K的范围是不是在-10与10之间。这样循环次数由38400次减为192次。
#12
楼上说的有道理
#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;
}
#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;
}
#13
其实题目给出了其他条件----就是-10<=k<=10