三元二次方程式x2+y 2=z2的正整数解x、y、z称为一组勾股数,又称为毕达哥拉斯三元数组。该方程式也称为“商高方程”或“毕达哥拉斯方程”。 试通过程序设计求指定区间[a,b]内的所有勾股数组。
/*试通过程序设计求指定区间[a,b]内的所有勾股数组。 输入 输入两个正整数a, b (a<b). 输出 输出[a,b]区间内的所有勾股数组。 样例输入 30, 90 样例输出 */ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> int main() { int a,b; int x,y,z,d; // printf("请输入区间[a,b]的上下限a,b:"); scanf("%d,%d",&a,&b);//如果里面有逗号,输入时a,b以逗号隔开而非默认的空格 //动手画图最重要;//下一轮的遍历的起点相较于与上一轮右移了一位.(当然,同一轮的遍历中,第一个数是固定的) /*不妨设x>y;勾股数中a,b不可能相等(根号2)故可以发现,如果x=y=k,则z=double sqrt(2)*k,即此时的z不是整数,故不需考虑*/ for(x=a;x<=b-2;x++){//外层控制x;另外,区间里的后两个数没必要有求平方和!(此时的z必在b后) for(y=x+1;y<=b-1;y++){//内层控制y d=x*x+y*y; z=sqrt(d);//开方函数sqrt(),发生取整,如果有小数部分,将会丢失,即此时z*z < d if(z>b)//此时的y对于当前的x已经过大,测试下一个x,并重置y(=x+1) break; //跳到上一重循环里.(测试下一个x下的新情况) /*若没有过大:下面的if()可以内嵌到if(z>b){里}*/ if(z*z==d)//说明之前的d能够刚好开方 { //把当前的x,y,z三元组打印出来. printf("%d^2+%d^2=%d^2\n",x,y,z); } }//for }//for }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」