找出这样的正整数:它不是9个不同的正整数的立方和。

elated 2008-09-09 11:11:50
如题,最好有代码和思路。
...全文
1299 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyingmenghuan 2009-10-17
  • 打赏
  • 举报
回复
xuexi9了
hanyingmenghuan 2009-10-17
  • 打赏
  • 举报
回复
xuexi9了
harveanyway 2009-10-16
  • 打赏
  • 举报
回复
算法很奇妙啊,可是试试不同的编程软件,效果不一样
冰岛男孩 2009-10-15
  • 打赏
  • 举报
回复
mark
elated 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yzfyzyl 的回复:]
C/C++ code#include <iostream>
using namespace std;

#include <stdio.h>
#define MAX_N 100
#define MAX_SQ 20000
int n3Map[MAX_N+1];
int s3Map[MAX_N+1];
int sq3Map[MAX_SQ+1];

unsigned Sqrt3(unsigned n)
{
unsigned nl=0, nr=MAX_N, nm=(MAX_N>>1);
for (;nl<nr;nm=(nl+nr+1)>>1)if ((nm*nm*nm)>n)nr=nm-1;else nl=nm;
return nm;
}

void init()
{
s3Map[0] = n3Map[0] = sq3Map…
[/Quote]
没看太明白,先把分给你吧,过后慢慢看。
blueshame 2008-09-17
  • 打赏
  • 举报
回复
感觉需要数学知识,没有数学知识,只能使用暴力了
yzfyzyl 2008-09-16
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

#include <stdio.h>
#define MAX_N 100
#define MAX_SQ 20000
int n3Map[MAX_N+1];
int s3Map[MAX_N+1];
int sq3Map[MAX_SQ+1];

unsigned Sqrt3(unsigned n)
{
unsigned nl=0, nr=MAX_N, nm=(MAX_N>>1);
for (;nl<nr;nm=(nl+nr+1)>>1)if ((nm*nm*nm)>n)nr=nm-1;else nl=nm;
return nm;
}

void init()
{
s3Map[0] = n3Map[0] = sq3Map[0] = 0;
for (int n=1; n<=MAX_N; ++n)
{
n3Map[n] = n*n*n;
s3Map[n] = s3Map[n-1] + n3Map[n];
}
for (int n=1; n<=MAX_SQ; ++n)
{
sq3Map[n] = Sqrt3(n);
}
}

int DFS(int nCnt, int nNums, int nMax=MAX_N)
{
int n3Root = sq3Map[nCnt];
if (nMax<=0 || nCnt<=0) return -1;
if (nNums<=1)
{
if (n3Map[n3Root] == nCnt)
return 1;
}
else
{
int n=n3Root;
if (n>nMax) n = nMax;
for (; s3Map[n]>=nCnt; --n)
{
int nRe = DFS(nCnt-n3Map[n], nNums-1, n-1);
if (nRe == 1)
return 1;
}
}
return 0;
}

#include <time.h>
int main(int argc, char *argv[])
{
init();
int n=27;
int t = clock();
int nc=2025-1;
for (n=2025; n<=MAX_SQ; ++n) //忽略2025前的解
{
int nr = DFS(n,9);
if (nr!=1)
{
++nc;
printf("%d ",n); //注释掉这句可以获得更快的速度
}
}
t = clock()-t;
printf("\nTotal= %d \tTime= %d ms\n", nc, t);
return 0;
}


本人的渣代码



飞燕算法群:46520219
nipa1989 2008-09-16
  • 打赏
  • 举报
回复
//求数组中各元素的立方和.
int SumOfCube (int a[], int n)
{
int sum=0;

int i=0;

for (; i <n; i++)
sum+=a[i] * a[i] * a[i];

return sum;
}
elated 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yzfyzyl 的回复:]
引用 19 楼 elated 的回复:
我也发现了,有些数没找出来。
不过你是如何知道这样的数是限个的?


从某个数开始,接连找了10万个,一个也找不到,所以就这样断言
不过要严格的数学证明,偶不会

to 20楼:
那个初中的公式在这没意义

附偶的算法(DFS):
给一数值n,从比n^(1/3)小的整数开始,选一个,其3次方与n相减
重复9次,但下一次选的数必须比上一次的要小,
如能够找到一个选取方法使结果为0,则n…
[/Quote]
能不能把代码发上来看看?
yzfyzyl 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 elated 的回复:]
我也发现了,有些数没找出来。
不过你是如何知道这样的数是限个的?
[/Quote]

从某个数开始,接连找了10万个,一个也找不到,所以就这样断言
不过要严格的数学证明,偶不会

to 20楼:
那个初中的公式在这没意义

附偶的算法(DFS):
给一数值n,从比n^(1/3)小的整数开始,选一个,其3次方与n相减
重复9次,但下一次选的数必须比上一次的要小,
如能够找到一个选取方法使结果为0,则n不合题意
最后加限界剪枝


飞燕算法群:46520219
jieao111 2008-09-15
  • 打赏
  • 举报
回复
up
大写的池 2008-09-15
  • 打赏
  • 举报
回复
暴力破解...

如果是9个连续整数:
可以利用:
1^3+2^3+3^3+...+n^3=?

1^3+2^3+...+n^3=[n(n+1)/2]^2
推导过程:
(n+1)^4-n^4=[(n+1)^2+n^2][(n+1)^2-n^2]
=(2n^2+2n+1)(2n+1)
=4n^3+6n^2+4n+1

2^4-1^4=4*1^3+6*1^2+4*1+1
3^4-2^4=4*2^3+6*2^2+4*2+1
4^4-3^4=4*3^3+6*3^2+4*3+1
......
(n+1)^4-n^4=4*n^3+6*n^2+4*n+1

各式相加有
(n+1)^4-1=4*(1^3+2^3+3^3...+n^3)+6*(1^2+2^2+...+n^2)+4*(1+2+3+...+n)+n

4*(1^3+2^3+3^3+...+n^3)=(n+1)^4-1+6*[n(n+1)(2n+1)/6]+4*[(1+n)n/2]+n
=[n(n+1)]^2

1^3+2^3+...+n^3=[n(n+1)/2]^2
elated 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yzfyzyl 的回复:]
不好意思,刚刚是从2025开始算的,所以少了好多。。。。
纠正一下,一共有7635个符合题目的数。。。

另外,楼主在8楼所写的代码是错的,漏解很严重。。。



飞燕算法群:46520219
[/Quote]
我也发现了,有些数没找出来。
不过你是如何知道这样的数是限个的?
e_sharp 2008-09-15
  • 打赏
  • 举报
回复
UP
yzfyzyl 2008-09-15
  • 打赏
  • 举报
回复
不好意思,刚刚是从2025开始算的,所以少了好多。。。。
纠正一下,一共有7635个符合题目的数。。。

另外,楼主在8楼所写的代码是错的,漏解很严重。。。



飞燕算法群:46520219
yzfyzyl 2008-09-15
  • 打赏
  • 举报
回复
晕。。。。原来是有这么小的上界的。。。。那效率再高也没什么必要了。。。。
一共有5611个满足题目要求的数,计算使用的时间是0.6秒。。。



飞燕算法群:46520219
yzfyzyl 2008-09-15
  • 打赏
  • 举报
回复
偶写了一下代码,计算10000以内所有的数用时0.15秒,有点慢,在想办法中



飞燕算法群:46520219
elated 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hqin6 的回复:]
引用 6 楼 elated 的回复:
这是Kenneth H. Rosen的那本《离散数学及其应用》上的原题
我想这道题是让找大的数,小的数没有什么意义.


我想这不应该用计算机来算吧,应该用数学里的逻辑推理,或者是……反正应该是数学方法,而不是穷举!

有诀窍!
[/Quote]
原题就是要求用计算机程序来求的。只用数学方法求不太可能,计算量太大了,也没有什么相关的定理性质。
太乙 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 elated 的回复:]
这是Kenneth H. Rosen的那本《离散数学及其应用》上的原题
我想这道题是让找大的数,小的数没有什么意义.
[/Quote]

我想这不应该用计算机来算吧,应该用数学里的逻辑推理,或者是……反正应该是数学方法,而不是穷举!

有诀窍!
elated 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yzfyzyl 的回复:]
我想先问问,那些数你有一个确定搜索上限不?
另外,这种数在小于2025以前一个也没有
不过能用在限界剪枝的条件好少,效率方面偶还没想到好的办法



飞燕算法群:46520219
[/Quote]
这样的数无穷无尽,当然得有上限。显然,小于1^3+2^3+3^3+4^3+……+9^3的数都能满足题意,但找这些数也没什么意义。
原题就是这样的,没有限制数的大小。我想出题者的意图是让我们找出几个大于2025的数就行了。
另外,好像有个什么定理和这道题的说法差不多。
加载更多回复(9)

69,373

社区成员

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

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