7-21 求特殊方程的正整数解 (15 分)
本题要求对任意给定的正整数N,求方程X^2 +Y^2 =N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X^2 +Y^2 =N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。
输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution
参考代码
#include<stdio.h>
#include<math.h> //头文件
int f(int a,int b){
return pow(a,2)+pow(b,2); //定义函数f=X^2 +Y^2
}
int main()
{
int x=0,y=0,n;
int isPrime=0; //有无Solution的标志
scanf("%d",&n);
while( f(x,y)<=10000){
x++; //使x!=0,因为题意要求所得为整数解
for(y=x;y<=sqrt(n-x*x);y++){ //y=x亦可保证y不为0
if( f(x,y)==n){
printf("%d %d\n",x,y);
isPrime=1;
}
}
y--; //当y==sqrt(n-x*x)时,若小数点后一位可进位,会导致f(x,y)>10000,而未得到之后的解
}
if(isPrime==0){
printf("No Solution");
}
return 0;
}
Summary
7-21的主要问题:
1st:题意要求正整数解,且N为正整数。
2nd:当y==sqrt(n-x*x)时,若小数点后一位可进位,会导致f(x,y)>10000,而未得到之后的解。
3rd:按照x从小到大的顺序得到结果。
C语言初学者,与诸君共勉。