1. 程式人生 > >2810 完美立方(枚舉——搜索空間解不唯一)

2810 完美立方(枚舉——搜索空間解不唯一)

blog stdio.h clas std tdi urn 所有 rip pro

描述

形如a3= b3 + c3 + d3的等式被稱為完美立方等式。例如123= 63 + 83 + 103 。編寫一個程序,對任給的正整數N (N≤100),尋找所有的四元組(a, b, c, d),使得a3 = b3 + c3 + d3,其中a,b,c,d 大於 1, 小於等於N,且b<=c<=d。

輸入
一個正整數N (N≤100)。
輸出
每行輸出一個完美立方。輸出格式為:
Cube = a, Triple = (b,c,d)
其中a,b,c,d所在位置分別用實際求出四元組值代入。

請按照a的值,從小到大依次輸出。當兩個完美立方等式中a的值相同,則b值小的優先輸出、仍相同則c值小的優先輸出、再相同則d值小的先輸出。
樣例輸入
24
樣例輸出
Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
 1 /*
 2 搜索空間中解不唯一的例子 
 3 問題 輸入n,計算並輸出所有小於等於n的完美立方式
 4 解題思路 1<n<=100,所以采用枚舉法
 5 重要的是根據b<=c<=d,縮小搜索空間,當枚舉的a小於以第一小的數b為首的連續三個數的立方和時,直接跳過
6 當枚舉的a小於以第二小的數c為首的連續二個數的立方和時,直接跳過 7 */ 8 #include<stdio.h> 9 int main() 10 { 11 int n; 12 int cude[101]; 13 int i; 14 int a,b,c,d; 15 while(scanf("%d",&n) != EOF) 16 { 17 for(i=1;i<=n;i++) 18 cude[i]=i*i*i;//優化1 實現將立方存入對應位置 19 for(a=6
;a<=n;a++){ 20 for(b=2;b<a;b++){ 21 if(cude[a] < cude[b] + cude[b+1] + cude[b+2]) break;//如果小於第一小的數的連續三個數立方和則直接跳過 22 for(c=b+1;c<a;c++){ 23 if(cude[a] < cude[b] + cude[c] + cude[c+1]) break;//如果小於第二小的數的連續二個數立方和則直接跳過 24 for(d=c+1;d<a;d++){ 25 if(cude[a]==cude[b]+cude[c]+cude[d]) 26 printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d); 27 } 28 } 29 } 30 } 31 } 32 return 0; 33 }

2810 完美立方(枚舉——搜索空間解不唯一)