再问:如何编程实现:求正整数a,b,c,使得a^3+b^3=22c^3

pfcz_myp 2009-12-01 11:22:00
类似如下的答案,从理论上应该正确,可是不能跑出哪怕一个正确的答案,很显然,下面这个程序中,a=1,b=1,进入内层循环中后,将从1一直跑到INT_MAX,而这显然是没有必要的呵呵,如何改进呢?有没有知道~挑战一下!弄个答案来瞅瞅:
#include <limits.h>
#include <stdio.h>
#include <math.h>
int a,b,c;
void main() {
for (a=1;a<INT_MAX;a++) {
for (b=1;b<INT_MAX;b++) {
for (c=1;c<INT_MAX;c++) {
if (fabs((double)a*a*a+(double)b*b*b-(double)22.0*c*c*c)<0.0001) {
printf("a=%d,b=%d,c=%d\n",a,b,c);
return;
}
}
}
}
}

...全文
338 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
pfcz_myp 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 tianzhaohui1 的回复:]
方法应该是对的,

但是循环到这么大的值 都出不了结果,

应该在整型范围内 是找不到结果了~
[/Quote]
应该不会小,而且我感觉肯定是要用到数论中的一些东西简化循环。。。
我上次搜索的时候看到有个网友给了证明的,不过后来再没有搜到了呵呵。
否则确实像是大海捞针。。。
sea_spray 2009-12-13
  • 打赏
  • 举报
回复
呵呵,有意思啊
tianzhaohui1 2009-12-13
  • 打赏
  • 举报
回复
方法应该是对的,

但是循环到这么大的值 都出不了结果,

应该在整型范围内 是找不到结果了~
pfcz_myp 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 crushor 的回复:]
说溢出也有道理,也许花了数学家半个学期的原因就是结果太大了,算不出来。
我不觉得python能比C++做的更好,虽然我也不懂python。
或者你换个64位的系统再算一次或者自己写个大数类。

[/Quote]
我也是想按大数处理的方法,不过现在很忙没时间弄呵呵。
我觉得python这方面好是因为无论多少位,它都能很完美的处理。呵呵~
crushor 2009-12-13
  • 打赏
  • 举报
回复
说溢出也有道理,也许花了数学家半个学期的原因就是结果太大了,算不出来。
我不觉得python能比C++做的更好,虽然我也不懂python。
或者你换个64位的系统再算一次或者自己写个大数类。
pfcz_myp 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 crushor 的回复:]
假设 b = n*a  ,ab可以互换,因此可以假定a小
代入原等式,得到
a^3 + n^3*a^3 = 22*c^3
合并同类项,把22挪过来,得
(n^3+1)/22*a^3=c^3
a,b,c都是整数,因此(n^3+1)/22也是整数
因此,循环求n,这应该比你那个循环速度快点吧,但是,很遗憾,我还是没找到合理的n
所以,我怀疑就是印刷错误,要不找找英文原版吧,如果作者还活着就给他发个邮件问问。

[/Quote]
图中那个德布兰奇应该是17世纪的人吧,不知道他的电子邮件哦。
本来想用百度或者Google找答案的,无奈找不到,也不知道用英文怎么表示。。。
不过我还是相信有解的,而且我总觉得是c/c++处理整数不太行,可能是有溢出。
我觉得Python应该可以,不过我现在还没有学。。。呵呵。。。
crushor 2009-12-13
  • 打赏
  • 举报
回复
假设 b = n*a ,ab可以互换,因此可以假定a小
代入原等式,得到
a^3 + n^3*a^3 = 22*c^3
合并同类项,把22挪过来,得
(n^3+1)/22*a^3=c^3
a,b,c都是整数,因此
(n^3+1)/22也是整数
因此,循环求n,这应该比你那个循环速度快点吧,但是,很遗憾,我还是没找到合理的n
所以,我怀疑就是印刷错误,要不找找英文原版吧,如果作者还活着就给他发个邮件问问。
pfcz_myp 2009-12-12
  • 打赏
  • 举报
回复

我还是觉得有解的。。。如图呵呵~
pfcz_myp 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 suchx1 的回复:]
#include"stdio.h"
#define max 300
int main()
{  int a,b,c,temp,i;
  int three[max]={0};
  for(i=0;i <max;i++)
  {  three[i]=i*i*i;
      printf("%d\n",three[i]);
  }
  c=1;
  for(a=1;a <max;a+=2)
  {  for(b=a+2;b <max;b+=2)
      {  for(;c <max;c++)
        { temp=three[a]+three[b]-22*three[c];
          if(!temp)
          {  printf("a=%d,b=%d,c=%\n",a,b,c);
          }
          else if(temp <0)
          {  break;
          }
        }
        if(c>=max)
        {  goto l1;
        }
      }
  }
  l1:;
  c=1;
  for(a=2;a <max;a+=2)
  {  for(b=a+2;b <max;b+=2)
      {  for(;c <max;c++)
        { temp=three[a]+three[b]-22*three[c];
          if(!temp)
          {  printf("a=%d,b=%d,c=%\n",a,b,c);
          }
          else if(temp <0)
          {  break;
          }
        }
        if(c>=max)
        {  goto l2;
        }
      }
  }
  l2:;
  printf("Please press any key to continue .\n");
  getch();
  return 0;
}
感觉好像方法没有错
[/Quote]
没怎么看明白,运行了下倒是很快出了结果。。。
不过都是每行1个数呀。。。
要不再研究研究~
suchx1 2009-12-12
  • 打赏
  • 举报
回复

#include"stdio.h"
#define max 300
int main()
{ int a,b,c,temp,i;
int three[max]={0};
for(i=0;i<max;i++)
{ three[i]=i*i*i;
printf("%d\n",three[i]);
}
c=1;
for(a=1;a<max;a+=2)
{ for(b=a+2;b<max;b+=2)
{ for(;c<max;c++)
{ temp=three[a]+three[b]-22*three[c];
if(!temp)
{ printf("a=%d,b=%d,c=%\n",a,b,c);
}
else if(temp<0)
{ break;
}
}
if(c>=max)
{ goto l1;
}
}
}
l1:;
c=1;
for(a=2;a<max;a+=2)
{ for(b=a+2;b<max;b+=2)
{ for(;c<max;c++)
{ temp=three[a]+three[b]-22*three[c];
if(!temp)
{ printf("a=%d,b=%d,c=%\n",a,b,c);
}
else if(temp<0)
{ break;
}
}
if(c>=max)
{ goto l2;
}
}
}
l2:;
printf("Please press any key to continue .\n");
getch();
return 0;
}
感觉好像方法没有错
suchx1 2009-12-12
  • 打赏
  • 举报
回复
先验证奇数
若a=b则2*a^3=22*c^3即a^3=11*c^3这是不可能的
int temp,a,b,c=1;
for(a=1;a<maxint;a+=2)
{ for(b=a+2;b<maxint;b+=2)
{ for(;c<maxint;c++)c只需要递增即可
temp=three[a]+three[b]-22*three[c];
if(!temp)
{ output;
}
else if(temp <0)
{ three[a]+three[b]<22*three[c]
three[a]+three[b]>22*three[c-1]
退出c循环后增大b将使three[a]+three[b]增大
不必使c从1开始,从three[a]+three[b]<22*three[c]
的c值开始即可
break; 如果temp<0再继续增大c就没有必要了
}
}
}
suchx 2009-12-12
  • 打赏
  • 举报
回复
再改进一下
先验证奇数
int temp;
for(a=1;a <maxint;a+=2)
{ for(b=a;b <maxint;b+=2)
{ for(c=1;c <maxint;c++)
temp=three[a]+three[b]-22*three[c];
if(!temp)
{ output;
}
else if(temp<0)
{ break; 如果temp<0再继续增大c就没有必要了
}
}
}
suchx 2009-12-12
  • 打赏
  • 举报
回复
可以改进下,因为a和b是等价的,第二重循环可以直接从a开始
先验证奇数
for(a=1;a <maxint;a+=2)
{ for(b=a;b <maxint;b+=2)
{ for(c=1;c <maxint;c++)
if(three[a]+three[b]==22*three[c])
{ output;
}
}
}
harizu76 2009-12-12
  • 打赏
  • 举报
回复
这题目难的
suchx1 2009-12-12
  • 打赏
  • 举报
回复
for(i=0;i <max;i++)
{ three[i]=i*i*i;
**printf("%d\n",three[i]);
}
出结果是因为这个**这个语句,其实没有找到解的
suchx 2009-12-12
  • 打赏
  • 举报
回复
感觉a^3+b^3=22*c^3
a和b必须同时为奇数或者同时为偶数,因为22*c^3为偶数,而x^3的奇偶性和x一致
所以感觉可以这样
不考虑溢出
先求3次方表three[]={1,8,27,......}
先验证奇数
for(a=1;a<maxint;a+=2)
{ for(b=1;b<maxint;b+=2)
{ for(c=1;c<maxint;c++)
if(three[a]+three[b]==22*three[c])
{ output;
}
}
}
再验证偶数
for(a=2;a<maxint;a+=2)
{ for(b=2;b<maxint;b+=2)
{ for(c=1;c<maxint;c++)
if(three[a]+three[b]==22*three[c])
{ output;
}
}
}
这样时间复杂度为O(2*(n/2*n/2*n))=O(n^3/2)比O(n^3)好一点
lylm 2009-12-01
  • 打赏
  • 举报
回复
if (fabs((double)a*a*a+(double)b*b*b-(double)22.0*c*c*c) <0.0001) {
printf("a=%d,b=%d,c=%d\n",a,b,c);
return; //这里如果找到不就返回了,不会跑到INT_MAX
}
问题是你这个方程,在PC的整数范围有解吗?
赵4老师 2009-12-01
  • 打赏
  • 举报
回复
估计无解.
我把程序里面的INT_MAX换成1000,运行后无解。
有兴趣的话换成10000,运行一晚上试试。
pfcz_myp 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thefirstz 的回复:]
整型肯定是没解的~~
[/Quote]
能给出证明么?不能凭感觉吧?
pfcz_myp 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lylm 的回复:]
if (fabs((double)a*a*a+(double)b*b*b-(double)22.0*c*c*c) <0.0001) {
                    printf("a=%d,b=%d,c=%d\n",a,b,c);
                    return;//这里如果找到不就返回了,不会跑到INT_MAX 
                }
问题是你这个方程,在PC的整数范围有解吗?

[/Quote]
哦,对哦,我自己改了一下了然后打印出来发现一直都是a=1,b=1,然后c就一直往上面加呵呵。
肯定有的。是在某个数论书上看到的。据说是某个外国数学家在小时候别人问他的题,结果他花了半年的时候解了出来,书是翻译的,除非“印刷错误”??
现在也不确定了。
加载更多回复(1)

33,319

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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