勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)
勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)
大部分的勾股数的题目很多人都是用for来便利,然后判断是不是平方数什么什么的,这样做的时候要对变量类型和很多细节都是要掌握好的,但是有没有一种方法就是输入一个数然后用数学的方法就可以吧答案(也就是另外两个勾股数求出来的方法了)
我基于勾股定理和一个重要的定理(就是加入最小边是奇数的话,长边和中边的差是1,如果最小边是偶数的话,那么长边和中边的差就是2的,然后利用这个性质和勾股定理,通过方程联立)
例题18203 神奇的勾股数
该题有题解
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
给你一个正整数n,问有没有一个直角三角形,它所有的边长都是正整数,而且n是它的最小边长。
输入格式
(单case)
一个数n(1 ≤ n ≤ 10000)。
输出格式
如果没有这样的直角三角形,输出“NO”(不包括双引号);
如果有,输出两个数,第一个数是另一条直角边边长,第二个数是斜边边长。
(确保只有一个答案)
输入样例
3
输出样例
4 5
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int a; 7 scanf("%d",&a); 8 int b,c; 9 if(a==1||a==2) 10 printf("NO"); 11 else if(a%2==0)//判断奇偶 12 { 13 b=a*a/4-1;//直接用数学公式法 14 c=a*a/4+1; 15 if(a<b&&a<c) 16 printf("%d %d",b,c); 17 else 18 printf("NO"); 19 } 20 else if(a%2!=0) 21 { 22 b=(a*a-1)/2; 23 c=(a*a+1)/2; 24 if(a<b&&a<c) 25 printf("%d %d",b,c); 26 27 else 28 printf("NO"); 29 } 30 // printf("%d %d",b,c); 31 return 0; 32 }
也就是说如果我们知道了最小边的话就可以不用for就直接用数学的公式就可以吧中边和大边给求出来了,那么加入最小边是不知道的,知道中边或者是长边的任意一个的话,该怎么求呢,
就基于上面的分析,我们还是利用了那个性质和勾股定理也是可以用数学公式发来吧其他边算出来的
如图:
思路:下面这道题目就是上面那个题目的进阶版了,因为它是要算出输入的x是短边中边长边的三种情况的
例题1079 三角形
时间限制:500MS 内存限制:65536K
提交次数:283 通过次数:82
题型: 编程题 语言: G++;GCC
Description
著名的数学家毕达哥拉斯可能从来都不曾想过有人居然会问他这样的一个问题:给出一个整数,存在多少个直角三角形,
它的某一条边的长度等于这个整数,而且其他边的长度也是整数。既然毕达哥拉斯不可能预见到有计算机的出现,
如果他回答不出来,那谁又能责怪他呢?但是现在既然你有了计算机,那么回答不出来就说不过去了。
输入格式
第一行有一个整数n,代表有多少个数据(1<=n<=20)。接下来有n行,每行代表一个数据。一个数据就是一个整数ai(a<=i<=n,1<=ai<=100)。
输出格式
每个数据都必须有相应的输出。两个数据的输出之间有一个空行。
对于每一个数据,如果找不到解,则输出一个空行。如果找到解,就把符合条件的所有直角三角形输出。每个三角形占一行,输出该三角形的另外两条边,
必须先输出长边,然后一个逗号,再输出短边。两个三角形之间不能有空行,而且必须按照长边降序排列。
输入样例
2
20
12
输出样例
101,99
52,48
29,21
25,15
16,12
37,35
20,16
15,9
13,5
代码:(待完善,我优化一下)