一个算法题:找一个最小的自然数x,使得:x=a*a*a+b*b*b=c*c*c+d*d*d

wdx888 2007-10-14 03:46:52
找一个最小的自然数x,使它等于不同的两对自然数的三次幂之和,即使得:
x=a*a*a+b*b*b=c*c*c+d*d*d
其中a,b,c,d都是自然数,且有a!=c和b!=d
要求:输出满足要求的最小自然数的值。
请高手指教.
...全文
722 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
JhunHoonXZ 2007-10-17
  • 打赏
  • 举报
回复
算法和以上的不同,不求立方的集合

//Testmain.java
package minmun;

import minmun.Loop;

public class Testmain {

public static void main(String[] args){
int x=1;
int times;
Loop lp=new Loop();

for(int n=0;n<10;x++){
//如果想得到多个这样的数,请自行修改for
//如(int n=0;n<5;x++){...后面的break换成n++
times=lp.loop(x);

if(times==2){
System.out.println(x+"="+lp.a+"^3+"+lp.b+"^3="+lp.c+"^3+"+lp.d+"^3");
n++;
}
}
}
}

//Max.java
package minmun;

public class Max {

public int maxMun(int x){

int mun=0;

while(mun*mun*mun<x){
mun++;
}
return --mun;
}
}

//Loop.java
package minmun;

import minmun.Max;

public class Loop {

int a,b,c,d;

public int loop(int x){

int times=0;
a=1;
b=new Max().maxMun(x);
c=0;
d=0;

for(;b>a;b--){
for(;a<b;a++){
if(a*a*a+b*b*b>x)break;
if(a*a*a+b*b*b==x){
times++;

if(times==1){
c=a;d=b;
}
else{
if(times==2){
return times;
}
}
}
}
}
return times;
}
}

JhunHoonXZ 2007-10-17
  • 打赏
  • 举报
回复
怎么说呢,现在结果是1729没错.
可假如这个数很大呢?或者根本没有这样的数呢?
先算立方的集合就必须给出一个循环次数..
a2bb 2007-10-16
  • 打赏
  • 举报
回复
算法是精华啊~
piaopiao11 2007-10-16
  • 打赏
  • 举报
回复

static int n=100;//循环次数
static int m=10;//每次递增数
public static void main(String[] args) {
for(int i=1;i<n;i++){
for(int i1=1;i1<m*i;i1++){
for(int i2=i1+1;i2<m*i;i2++){
for(int i3=i2;i3<m*i;i3++){
int i4=i3+1;
if(i4<m*(i-1))
{
i4=m*(i-1);
}
for(;i4<m*i;i4++){
if(i1*i1*i1*i1+i4*i4*i4*i4==i2*i2*i2*i2+i3*i3*i3*i3){
System.out.println(i1+","+i4+"--"+i2+","+i3);
}
}
}
}
}

}
}
huwh 2007-10-16
  • 打赏
  • 举报
回复
这个关键是看算法,算法决定此程序的速度
bindian 2007-10-16
  • 打赏
  • 举报
回复
学习
qybao 2007-10-15
  • 打赏
  • 举报
回复
没有java环境,所以按照上面的代码用javascript写了一个测试,结果是
find number: x=1729 a=1 b=12 c=9 d=10
但是不知道这样的x是不是最小的(最好能用数学来证明),可以在一定范围内找x的集合,然后对集合排序,最后输出最小。(可以把下面的注释掉的代码恢复就可以找x集合,可以设置相应的MAX_SET来获得x集合数)

<html>
<script language="javascript">
var xSet = new Array();
var rSet = new Array();
var MAX_SET = 5;
function unloadMe() {
//do somthing here
}

function loadMe() {
var sum;
var rst;
var count = 0;
for (var s=4; ; s++) {
sum = new Array();
for (var i=1; i<=s; i++) {
sum[i-1] = i*i*i;
}

rst = getMinNum(sum);
if (rst[0] != 0) {
rSet[count] = rst;
xSet[count++] = rst[0];
//if (count > MAX_SET) {
break;
//}
}
}
xSet.sort(sortMethod);
for (var i=0; i<rSet.length; i++) {
if (rSet[i][0] == xSet[0]) {
showResult(rSet[i], 0);
} else {
showResult(rSet[i], 1);
}
}
}

function getMinNum(sum) {
var rst = new Array(0, 0, 0, 0, 0);
var len = sum.length;
for (var a=0; a<len-3; a++) {
for (var c=a+1; c<len-2; c++) {
for (var d=c+1; d<len-1; d++) {
for (var b=d+1; b<len; b++) {
if (sum[a]+sum[b]==sum[c]+sum[d]) {
var found = 0;
for (var i=0; i<xSet.length; i++) {
if (xSet[i] == sum[a]+sum[b]) {
found = 1;
break;
}
}

if (found == 0) {
rst[0] = sum[a]+sum[b];
rst[1] = a+1;
rst[2] = b+1;
rst[3] = c+1;
rst[4] = d+1;
return rst;
}
}
}
}
}
}

return rst;
}

function showResult(rst, flg) {
document.write("<p>");
if (flg == 0) {
document.write("find number:");
} else {
document.write("possible number:");
}
document.write(" x=" + rst[0]);
document.write(" a=" + rst[1]);
document.write(" b=" + rst[2]);
document.write(" c=" + rst[3]);
document.write(" d=" + rst[4]);
document.write("</p>");
}

function sortMethod(a, b) {
return a - b;
}

</script>
<body onload="loadMe();" onunload="unloadMe();">
</body>
</html>

Terrayer 2007-10-15
  • 打赏
  • 举报
回复
我觉得有点脑筋急转弯的味道
zixuliusu 2007-10-15
  • 打赏
  • 举报
回复
a!=c
b!=d

那就a=d=1 c=b=2就是了 哈哈~~~

貌似跟编程无关哈~~~

你给的题不好`
cxz7531 2007-10-15
  • 打赏
  • 举报
回复
9=1^3+2^3=2^3+1^3

a=1,b=2
c=2,d=1

a!=c,b!=d


可以证明不会有比9再小的了
chyx413332087 2007-10-15
  • 打赏
  • 举报
回复
mark
超级大笨狼 2007-10-15
  • 打赏
  • 举报
回复
稍微优化了一下:

int max = 1290;
int[] Arr = new int[max];
for (int i = 0; i < max; i++)
{
Arr[i] = (i + 1) * (i + 1) * (i + 1);
}

int a = 0;
int b = 1;
int c = 2;
int d = 3;
bool flag = true;
while ( flag)
{
b = a + 1;
while (b < max - 2 && flag)
{
c = b + 1;
while (c < max - 1 && flag)
{
d = c + 1;
while (Arr[d] <= Arr[c] + Arr[b] - Arr[a] && flag)
{
if (Arr[a] + Arr[d] == Arr[c] + Arr[b])
{
Console.WriteLine(a + 1);
Console.WriteLine(b + 1);
Console.WriteLine(c + 1);
Console.WriteLine(d + 1);
Console.WriteLine(Arr[a] + Arr[d]);
Console.WriteLine(Arr[b] + Arr[c]);
flag = false;
}
d++;
}
c++;
}
b++;
}
a++;
}
超级大笨狼 2007-10-15
  • 打赏
  • 举报
回复

int max = 1290;
int[] Arr = new int[max];
for (int i = 0; i < max; i++)
{
Arr[i] = (i + 1) * (i + 1) * (i + 1);
}
int a, b, c, d;
a = b = c = d = 0;
bool flag = true;
while (a < max - 3 && flag)
{
b = a + 1;
while (b < max - 2 && flag)
{
c = b + 1;
while (c < max - 1 && flag)
{
d = c + 1;
while (d < max && flag)
{
if (Arr[a] - Arr[b] == Arr[c] - Arr[d])
{
Console.WriteLine(a + 1);
Console.WriteLine(b + 1);
Console.WriteLine(c + 1);
Console.WriteLine(d + 1);
Console.WriteLine(Arr[a] + Arr[d]);
Console.WriteLine(Arr[b] + Arr[c]);
flag = false;
}
d++;
}
c++;
}
b++;
}
a++;
}
Console.Read();
yztommyhc 2007-10-15
  • 打赏
  • 举报
回复
1 9 10 12 这是结果
yztommyhc 2007-10-15
  • 打赏
  • 举报
回复
回elukuangben:

因为从数学的角度讲a[i] + a[low] == a[m] + a[n]是不完全正确的,比如a[m] + a[low] == a[i] + a[n]也是有可能的

我认为我那个方法没问题。因为我已经把a[i]限定为最大的那个数,而循环是从最小的数a[low]开始的。
那么还有2个数m,n一定是他们中间。
qybao 2007-10-14
  • 打赏
  • 举报
回复
笔误
上面的代码
rst[0] = sum[a]+sum[b];
rst[1] = a+1;
rst[2] = b+1;
rst[3] = c+1;
rst[4] = d+1;
return rst;
qybao 2007-10-14
  • 打赏
  • 举报
回复
忽略了一些条件,上面的代码有问题,应该还是先找立方和的集合,然后再找相应的整数。

int[] sum;
int[] rst;
for (int s=4; ; s++) {
sum = new int[s];
for (int i=1; i<=s; i++) {
sum[i] = i*i*i;
}
rst = findMinNum(sum);
if (rst[0] != 0) {
System.out.printf("find number: x=%d, a=%d, b=%d, c=%d, d=%d", rst[0], rst[1], rst[2], rst[3], rst[4]);
break;
}
}

int[] findMinNum(int[] sum) {
int[] rst = {0, 0, 0, 0, 0};
for (int a=0; a<sum.length; a++) {
for (int c=a+1; c<sum.length; c++) {
for (int d=c+1; d<sum.length; d++) {
for (int b=d+1; b<sum.length; b++) {
if (sum[a]+sum[b] == sum[c]+sum[d]) {
rst[0] = sum[a]+sum[b];
rst[1] = a;
rst[2] = b;
rst[3] = c;
rst[4] = d;
return rst;
}
}
}
}
}
return rst[0];
}
elukuangben 2007-10-14
  • 打赏
  • 举报
回复
没测试过
但是对yztommyhc 的做法表示怀疑
因为从数学的角度讲a[i] + a[low] == a[m] + a[n]是不完全正确的,比如a[m] + a[low] == a[i] + a[n]也是有可能的
qybao 2007-10-14
  • 打赏
  • 举报
回复
这个问题的条件还有点问题
a=d, b=c算不算?
如果a,b,c,d都不等,则可以推测
a<c<d<b
int[] findMixNum() {
int[] num = {0, 0, 0, 0, 0};
for (int a=0; ; a++) {
for (int c=a+1; ; c++) {
for (int d=c+1; ; d++) {
for (int c=d+1; ; b++) {
if (b*b*b >= Integer.MAX_VALUE-a*a*a) {
//超出整数范围
num[4] = 0;
return num;
}
num[4] = a*a*a + b*b*b;
if (c*c*c+d*d*d==num[4]) {
num[0] = a;
num[1] = b;
num[2] = c;
num[3] = d;
return num;
}
}
}
}
}
return num;
}
ninesea 2007-10-14
  • 打赏
  • 举报
回复
n1+n2=n3+n4
n3>n1 n4<n2
n3<n1 n4>n2
循环要从2头向中间查找
加载更多回复(4)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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