三元二次方程式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
}

在这里插入图片描述

posted @   xuchaoxin1375  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示