17 公式求解
作者: 朱星垠時間限制: 10S章節: 循環
問題描述 :
明明剛上初中,數學課上老師教了平方的概念,即兩個相同的數相乘可以表示爲這個數的平方:a×a = a 2。明明覺得這很有趣,就開始研究起來,很快掌握了這個知識點。但是在一次考試中,明明遇到了一個難題,題目的要求是有四個正整數a、b、x、y,他們各自的平方數組成了一個等式a^2 + x^2 = b^2 + y^2,現在已知a和b,請求出所有小於等於100的x、y,來滿足這個等式。例如給你a=2、b=5,我們可求出的解是x=5、y=2和x=11、y=10。 明明雖然明白了題目的意思,但是要自己求解卻顯得相當困難。他想了很久也沒有能夠解出這道題目。放學回家就開始問他的爸爸,他爸爸雖然對數學很精通,但是也無法一時給出正確的答案,於是他就求助於你,幫他解決這個問題。 明明的問題可以歸結爲:給定兩個正整數a、b,求所有的正整數x和y,使a^2 + x^2 = b^2 + y^2,其中a、b、x、y都不大於100。在所有的有效解中,按x的大小進行排序,從小到大輸出。
輸入說明 :
你寫的程序要求從標準輸入設備中讀入測試數據作爲你所寫程序的輸入數據。標準輸入設備中有多組測試數據:每組測試數據由一個不大於100的正整數a後跟一個不大於100的正整數b組成,a和b之間由一個空格分開,形成一行數據,其行首和行尾都沒有任何空格,當a和b同時爲0時,表示輸入結束;每組測試數據與其後一組測試數據之間沒有任何空行,第一組測試數據前面以及最後一組測試數據後面也都沒有任何空行。
輸出說明 :
對於每一組測試數據,你寫的程序要求計算出一組或者多組相應的運算結果,並將這一組或者多組運算結果作爲你所寫程序的輸出數據依次寫入到標準輸出設備中。每組運算結果由一個不大於100的正整數x後跟一個不大於100的正整數y組成,x和y之間由一個空格分開,形成一行數據,其行首和行尾都沒有任何空格;如果有多組相應的運算結果,則按x的大小進行排序,從小到大輸出。 每組運算結果與其後一組運算結果之間有一個空行,最後一組運算結果後面沒有空行。 注:通常,顯示屏爲標準輸出設備。
輸入範例 :
2 5
3 4
0 0輸出範例:
5 2
11 104 3
筆記
需要注意幾個條件:
- y^2 = a^2-b^2+x^2,顯然,a^2-b^2+x^2 ≥ 0;
- x,y∈[1,100],且爲整數;
- a,b不可同時爲0,因爲當a、b同時爲0時,x和可取任意值;
判斷一個數是否爲整數
假設有實數a,如何判斷它是否是整數呢?
易知,若一個數是整數,則其小數部分爲0。
可編碼如下:
const double eps = 1e-8;
#define Equ(a,b) (fabs((a)-(b))<(eps))
int is_integer(double a){
int integer = (int)a; //整數部分
double decimal = a-(double)integer; //小數部分
if(Equ(decimal,0.00)){
return 1;
}else{
return 0;
}
}
宏定義
#define Equ(a,b) (fabs((a)-(b))<(eps))
爲浮點數的判等,詳見>>DHU OJ | 基本練習-21 計算e
代碼
#include<stdio.h>
#include<math.h>
const double eps = 1e-8;
#define Equ(a,b) (fabs((a)-(b))<(eps))
//用一個結構體記錄<x,y>對
struct data{
int x;
int y;
};
//判斷實數a是否是整數
int is_integer(double a){
int integer = (int)a;
double decimal = a-(double)integer;
if(Equ(decimal,0.00)){
return 1;
}else{
return 0;
}
}
int main(){
int a,b;
struct data d[101]; //使用結構體數組記錄每一組結果
int flag = 1;
while(scanf("%d %d",&a,&b)!=EOF){
//a和b不可同時取0
if(a==0 && b==0) {
continue;
}
int n = 0;
int i;
for(i=1;i<=100;i++){
int x_t,y_2_t;
x_t = i;
y_2_t = a*a-b*b+x_t*x_t;
//y^2必須大於等於零
if(y_2_t>0 && is_integer(sqrt(1.0*y_2_t))){
d[n].x = x_t;
d[n].y = (int)sqrt(1.0*y_2_t);
n++;
}
}
//對結果進行排序
int j;
for(i=0;i<n;i++){
int x_t = d[i].x;
int y_t = d[i].y;
for(j=i;j>0;j--){
if(x_t<d[j-1].x){
d[j].x = d[j-1].x;
d[j].y = d[j-1].y;
}else{
d[j].x = x_t;
d[j].y = y_t;
break;
}
}
}
if(flag){
flag = 0;
}else{
printf("\n\n");
}
for(i=0;i<n;i++){
if(i>0){
printf("\n");
}
printf("%d %d",d[i].x,d[i].y);
}
}
return 0;
}