package cn.nuaa.service;public class MinNum { public static void main(String args[]) { int low = 0, m = 0, n = 0, i = 0; long a[] = new long[21]; // 看一下他们的立方 for (i = 1; i < 21; i++) { a[i] = i * i * i; System.out.print(a[i] + " "); } System.out.println( " ");
// 循环查找,low,m,n,i代表这4个数,有大小顺序 for (i = 4; i < 21; i++) { for (low = 1; low < i - 3; low++) { for (m = low; m < i - 2; m++) for (n = m + 1; n < i - 1; n++) { if (a[i] + a[low] == a[m] + a[n]) System.out.print(low + " " + m + " " + n + " " + i); break; } } } System.out.print(" END!!"); } }
一个比较笨但很快就可以想到的办法.写一个for循环.public class Test { public static void main(String[] args) { A: for(int x = 1; x < 50; ++x) //估算x的范围,假定在50范围中求 for(int a = 1; a <= x; ++a) for(int b = 1; b <= x; ++b) for(int c = 1; c <= x; ++c) for(int d = 1; d <= x; ++d) { if(a != c && b != d && (x == Math.pow(a, 3) + Math.pow(b, 3)) && (x == Math.pow(c, 3)+ Math.pow(d, 3))) { System.out.println("Result is " + x); break A; } } }
没有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; } }
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();
稍微优化了一下: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++; }
{
public static void main(String args[])
{
int low = 0, m = 0, n = 0, i = 0;
long a[] = new long[21]; // 看一下他们的立方
for (i = 1; i < 21; i++)
{
a[i] = i * i * i;
System.out.print(a[i] + " ");
}
System.out.println( " ");
// 循环查找,low,m,n,i代表这4个数,有大小顺序
for (i = 4; i < 21; i++)
{
for (low = 1; low < i - 3; low++)
{
for (m = low; m < i - 2; m++)
for (n = m + 1; n < i - 1; n++)
{
if (a[i] + a[low] == a[m] + a[n])
System.out.print(low + " " + m + " " + n + " " + i);
break;
}
}
}
System.out.print(" END!!");
}
}
public static void main(String[] args) {
A: for(int x = 1; x < 50; ++x) //估算x的范围,假定在50范围中求
for(int a = 1; a <= x; ++a)
for(int b = 1; b <= x; ++b)
for(int c = 1; c <= x; ++c)
for(int d = 1; d <= x; ++d) {
if(a != c && b != d && (x == Math.pow(a, 3) + Math.pow(b, 3)) && (x == Math.pow(c, 3)+ Math.pow(d, 3))) {
System.out.println("Result is " + x);
break A;
}
}
}
n3>n1 n4<n2
n3<n1 n4>n2
循环要从2头向中间查找
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;
}
但是对yztommyhc 的做法表示怀疑
因为从数学的角度讲a[i] + a[low] == a[m] + a[n]是不完全正确的,比如a[m] + a[low] == a[i] + a[n]也是有可能的
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];
}
上面的代码
rst[0] = sum[a]+sum[b];
rst[1] = a+1;
rst[2] = b+1;
rst[3] = c+1;
rst[4] = d+1;
return rst;
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>
那么还有2个数m,n一定是他们中间。
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();
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++;
}
c=2,d=1a!=c,b!=d
可以证明不会有比9再小的了
b!=d那就a=d=1 c=b=2就是了 哈哈~~~貌似跟编程无关哈~~~你给的题不好`
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);
}
}
}
}
}
}
}
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;
}
}