蓝桥杯国赛 勾股定理

蓝桥杯国赛 勾股定理

勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。

已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。

求满足这个条件的不同直角三角形的个数。

【数据格式】
输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。

例如,输入:
5
程序应该输出:
1

再例如,输入:
100
程序应该输出:
2

再例如,输入:
3
程序应该输出:
0

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。


见网上大佬都是使用的平方差来做的,蒟蒻就发表一下打表的题解吧

解题思路:
先打表记录1-n的平方值(因为n<10000000,所以使用long long),然后使用双指针从1和n-1双向遍历就行了。具体细节如下所示

例如

n=5,则1-5的平方为{1,4,9,16,25} ,开始时left指向下标为1的元素1,right指向下标为4(n-1)的元素16,1+16<25,代表当前的两边之和小于5的平方,那么只需要增大两边之和,那么left++。指向 4,4+16=20<25,left--,到left指向9时,此时 9+16=25,符合条件,则sum++,right--,left++;如果left和right下标之元素之和大于25时,则代表两边之和过大,需要缩小,则,right--,直到left>right.结束循环。

代码如下.

#include <iostream>
#include <cstdio>

using namespace std;
long long a[10000005];
int main(){
	int n,sum=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		a[i]=i*i;//打表 
		//cout<<a[i]<<' ';
	}
	//cout<<endl;
	int left=1,right=n-1;
	while(left<=right){
		//满足勾股定理 
		if(a[left]+a[right]==a[n]){
			sum++;
			left++;
			right--; 
		}else if(a[left]+a[right]<a[n]){//小于代表需要更大的数,则left++ 	
			left++; 
		}else//大于代表需要更小的数 
			right--;
	}
	 cout<<sum;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值