改代碼事小,把算法邏輯中的錯誤找到才是關鍵。
按LZ的邏輯:
for(a=5;a<=n;a++){
for(d=a-1;d>3;d--){
for(c=d-1;c>2;c--){
for(b=c-1;b>1;b--){
我比較能理解LZ的想法,a非降序的條件下,保證a相同時d非升序排列(相當於b+c升序),再保證d相同時c非升序排列(相當於b升序),因此保證了b升序排列。
但前提是只有a相同時d也相同才能保證c非升序,b升序;如果a相同時d降序,上面的邏輯完全不適用(不知道LZ有沒有體會到這層意思……),就比如:
(87,20,54,79)
(87,38,48,79)
此處d都為79,所以只要c非升序,b壹定升序。
而下面:
(90,25,38,87)
(90,10,60,80)
壹旦d降序排列,就不能保證c非升序排列,同時如果很不幸地c升值得比d降值大得多,b就變成降序排列了,出錯。
如果要優先確保b為降序排列,那就應該把b的循環寫在前面才能夠很好地控制。
程序修改如下:
#include<stdio.h>
int main()
{
int n,a,b,c,d;
scanf("%d",&n);
for(a=5;a<=n;a++){
for(b=4;b<=a-1;b++){
for(c=3;c<b-1;c++){
for(d=2;d<=c-1;d++){
if(a*a*a==b*b*b+c*c*c+d*d*d){
printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d);
}
}
}
}
}
return 0;
}
望采納~如您還有不解,歡迎追問~