C语言技术论坛
发布网友
发布时间:2022-05-16 00:48
我来回答
共1个回答
热心网友
时间:2023-10-05 11:03
#include<stdio.h>
#include<math.h>
int
isok(int
n)
/*判断n是不是一个数的三次方*/
{
int
i;
int
j=sqrt(n);
for(i=1;i<=j;i++)
if(n==(i*i*i))
return
i;
return
0;
}
int
main()
{
int
r[2][2]={0},i,k,p,q,m,n,total;
while(1)
{
r[0][0]=0;
r[0][1]=0;
r[1][0]=0;
r[1][1]=0;
k=i/2;
total=0;
for(p=0;p<=k;p++)
{
q=i-p;
m=isok(p);
n=isok(q);
if(m*m*m+n*n*n==i)
{
if(total==0||(r[0][0]!=m&&r[0][0]!=n))
{
r[total][0]=m;
r[total][1]=n;
total++;
}
if(total==2)
{
printf("%d=%d*%d*%d+%d*%d*%d=%d*%d*%d+%d*%d*%d\n",i,r[0][0],r[0][0],r[0][0],r[0][1],r[0][1],r[0][1],r[1][0],r[1][0],r[1][0],r[1][1],r[1][1],r[1][1]);
return
0;
}
}
}
i++;
}
return
0;
}
我的思路是从0开始找,找到的第一个满足条件的数就是最小的。
对每个数i来说,从p的值为0到i/2,q的值为i-p,这样i=p+q.
只要判断p和q是否都是一个数的三次方就行了。
这里我用isok(int
n)函数判断n是不是一个数的三次方。
比如p=27,m=isok(int
p)那么m=3.
如果找到第一对p和q,这时total=0,所以直接存入r[0][0],r[0][1]
然后给total加1.
当找到第二对p和q时,就要判断是否满足题中给定的条件:
条件:***其中a,b,c,d
都是自然数,且有a不等于c,a不等于d
。
***
若满足,则存入r[1][0],r[1][1]
再给total加1.
此时total=2,输出,结束程序。
当然,bee0873的程序看起来比较简单,呵呵。
我的程序的优点是:思路比较通用化,比如
从0开始找,直到找到为止,不会有1000000的*,所以思路对别的问题也适用。
另外在时间效率上也进行了一定的控制,比如判断n是不是一个数的三次方,控制在0到sqrt(n)的范围内查找三次方根(当然还可以更精确一点),找i=p+q中的p和q时只在0到i/2内找,因为过了i/2后,p和q的值只是和以前的p、q反了一下。
如果采用bee0873的程序,没有对题目条件进行审核,会有一大堆的输出呀,有的不满足条件,呵呵。
楼主自选吧。