问题描述 :
明明刚上初中,数学课上老师教了平方的概念,即两个相同的数相乘可以表示为这个数的平方:a×a = a 2。明明觉得这很有趣,就开始研究起来,很快掌握了这个知识点。但是在一次考试中,明明遇到了一个难题,题目的要求是有四个正整数a、b、x、y,他们各自的平方数组成了一个等式a2 + x2 = b2 + y2,现在已知a和b,请求出所有小于等于100的x、y,来满足这个等式。例如给你a=2、b=5,我们可求出的解是x=5、y=2和x=11、y=10。 明明虽然明白了题目的意思,但是要自己求解却显得相当困难。他想了很久也没有能够解出这道题目。放学回家就开始问他的爸爸,他爸爸虽然对数学很精通,但是也无法一时给出正确的答案,于是他就求助于你,帮他解决这个问题。 明明的问题可以归结为:给定两个正整数a、b,求所有的正整数x和y,使a2 + x2 = b2 + y2,其中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 10
4 3
思想:注意看题目,当输入0 0的时候不进行输出,每一组数据的解输出结束后空一行,最后一组不空,这个可以采用在下一个元素输出前进行空行(第一组除外)的处理方式。
两层循环遍历1-100 如果有内外层的值符合表达式,那么输出并空行,前面有一个处理每组输出间隔空行的逻辑。
#include <stdio.h> int main() { int i,j,a,b; int x,y; int count = 0; while(scanf("%d %d",&a,&b) != EOF) { if(a==0&&b==0){ break; } count++; //第一个解没有空行,后面count=2开始都符合该项所以在前面有一个空行 if (count>1){ printf("\n"); } for (i=0;i<100;i++){ for(j=0;j<100;j++){ x = i*i; y = j*j; if (x+a*a == y +b*b){ printf("%d %d\n",i,j); } } } } return 0; }